/ Hex Artifact Content
Login

Artifact 7aa412e7e56eb53649d87766f3064994a31991ee2b2716bf8c3129fa15cc7653:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 76 2d 3e   int nNew = (v->
1180: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
1190: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  v->nOpAlloc*2 : 
11a0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
11c0: 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (v->nOpAllo
11d0: 63 20 3f 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? v->nOpAlloc*
11e0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
11f0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
1200: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1210: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
1220: 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  /* Ensure that t
1230: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 56 44 42  he size of a VDB
1240: 45 20 64 6f 65 73 20 6e 6f 74 20 67 72 6f 77 20  E does not grow 
1250: 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20 20 69  too large */.  i
1260: 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e 64 62 2d  f( nNew > p->db-
1270: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1280: 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 20 29 7b  IMIT_VDBE_OP] ){
1290: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
12a0: 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  ault(p->db);.   
12b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12c0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  OMEM;.  }..  ass
12d0: 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f  ert( nOp<=(1024/
12e0: 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20  sizeof(Op)) );. 
12f0: 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28   assert( nNew>=(
1300: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
1310: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
1320: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
1330: 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65  >db, v->aOp, nNe
1340: 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  w*sizeof(Op));. 
1350: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1360: 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20   p->szOpAlloc = 
1370: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1380: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
1390: 3b 0a 20 20 20 20 76 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    v->nOpAllo
13a0: 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  c = p->szOpAlloc
13b0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
13c0: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
13d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
13e0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
13f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1400: 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  PT);.}..#ifdef S
1410: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
1420: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
1430: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
1440: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1450: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
1460: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
1470: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
1480: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
1490: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
14a0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
14b0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
14c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
14d0: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
14e0: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
14f0: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
1500: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
1510: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1520: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
1530: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
1540: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
1550: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
1560: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
1570: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
1580: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
1590: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
15a0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
15b0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
15c0: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
15d0: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
15e0: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
15f0: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
1600: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
1610: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
1620: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
1630: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
1640: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
1650: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
1660: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
1670: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
1680: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
1690: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
16a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
16b0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
16c0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
16d0: 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f  INLINE int growO
16e0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
16f0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1700: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61  p2, int p3){.  a
1710: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
1720: 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  oc<=p->nOp );.  
1730: 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28  if( growOpArray(
1740: 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 31  p, 1) ) return 1
1750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
1760: 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29  OpAlloc>p->nOp )
1770: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1790: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
17a0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
17b0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
17c0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
17d0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
17e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
17f0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
1800: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
1810: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1820: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1830: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30  .  assert( op>=0
1840: 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20   && op<0xff );. 
1850: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
1860: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=i ){.    retur
1870: 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c  n growOp3(p, op,
1880: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1890: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
18a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
18b0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
18c0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d  = (u8)op;.  pOp-
18d0: 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p5 = 0;.  pOp->
18e0: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
18f0: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
1900: 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e  p3 = p3;.  pOp->
1910: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.p = 0;.  pOp-
1920: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
1930: 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c  USED;.#ifdef SQL
1940: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
1950: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f  IN_COMMENTS.  pO
1960: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  p->zComment = 0;
1970: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1980: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1990: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
19a0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
19b0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pTrace ){.    sq
19c0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
19d0: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
19e0: 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64  ]);.    test_add
19f0: 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  op_breakpoint();
1a00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
1a10: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
1a20: 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20    pOp->cycles = 
1a30: 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20  0;.  pOp->cnt = 
1a40: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1a50: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1a60: 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72  ERAGE.  pOp->iSr
1a70: 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69  cLine = 0;.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1a90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1aa0: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1ab0: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad0: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1ae0: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1af0: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1b00: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1b10: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
1b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b30: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
1b40: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1b50: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
1b60: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1b70: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1b80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1b90: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1ba0: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  1, p2, 0);.}../*
1bb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1bc0: 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  or an unconditio
1bd0: 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  nal jump to inst
1be0: 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f  ruction iDest.*/
1bf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1c00: 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e  Goto(Vdbe *p, in
1c10: 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75  t iDest){.  retu
1c20: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1c30: 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp3(p, OP_Goto,
1c40: 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d   0, iDest, 0);.}
1c50: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1c60: 64 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  de to cause the 
1c70: 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62  string zStr to b
1c80: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a  e loaded into.**
1c90: 20 72 65 67 69 73 74 65 72 20 69 44 65 73 74 0a   register iDest.
1ca0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1cb0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62  beLoadString(Vdb
1cc0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
1ce0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
1cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1d00: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
1d10: 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c   iDest, 0, zStr,
1d20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
1d30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1d40: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c   initializes mul
1d50: 74 69 70 6c 65 20 72 65 67 69 73 74 65 72 73 20  tiple registers 
1d60: 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74  to string or int
1d70: 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  eger.** constant
1d80: 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
1d90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 69 44 65  s begin with iDe
1da0: 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20  st and increase 
1db0: 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a  consecutively..*
1dc0: 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69  * One register i
1dd0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f  s initialized fo
1de0: 72 20 65 61 63 68 20 63 68 61 72 61 63 67 74 65  r each characgte
1df0: 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20  r in zTypes[].  
1e00: 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20  For each.** "s" 
1e10: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79  character in zTy
1e20: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1e30: 74 65 72 20 69 73 20 61 20 73 74 72 69 6e 67 20  ter is a string 
1e40: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1e50: 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20  is.** not NULL, 
1e60: 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68  or OP_Null if th
1e70: 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c  e value is a nul
1e80: 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20  l pointer.  For 
1e90: 65 61 63 68 20 22 69 22 20 63 68 61 72 61 63 74  each "i" charact
1ea0: 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b  er.** in zTypes[
1eb0: 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ], the register 
1ec0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1ed0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  o an integer..**
1ee0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
1ef0: 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74   string does not
1f00: 20 65 6e 64 20 77 69 74 68 20 22 58 22 20 74 68   end with "X" th
1f10: 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52  en an OP_ResultR
1f20: 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  ow instruction.*
1f30: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  * is generated f
1f40: 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  or the values in
1f50: 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  serted..*/.void 
1f60: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
1f70: 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  Load(Vdbe *p, in
1f80: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
1f90: 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e  har *zTypes, ...
1fa0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1fb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1fc0: 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   c;.  va_start(a
1fd0: 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f  p, zTypes);.  fo
1fe0: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70  r(i=0; (c = zTyp
1ff0: 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  es[i])!=0; i++){
2000: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20  .    if( c=='s' 
2010: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2020: 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28  har *z = va_arg(
2030: 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
2040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2050: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d  dbeAddOp4(p, z==
2060: 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50  0 ? OP_Null : OP
2070: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65  _String8, 0, iDe
2080: 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a  st+i, 0, z, 0);.
2090: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
20a0: 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 73 71  ='i' ){.      sq
20b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20c0: 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76  p, OP_Integer, v
20d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20  a_arg(ap, int), 
20e0: 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20 7d 65  iDest+i);.    }e
20f0: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
2100: 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f  skip_op_resultro
2110: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  w;.    }.  }.  s
2120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2130: 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (p, OP_ResultRow
2140: 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73 6b 69  , iDest, i);.ski
2150: 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3a 0a  p_op_resultrow:.
2160: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
2170: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2180: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2190: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
21a0: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
21b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
21c0: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
21d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
21e0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
21f0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
2200: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
2210: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
2220: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
2230: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
2240: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
2250: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
2260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2270: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
2280: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
2290: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
22a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
22b0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
22c0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
22d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
22e0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
22f0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
2300: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
2310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2320: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
2330: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
2340: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
2350: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
2360: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
2370: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
2380: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2390: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
23a0: 61 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49  alue with a P4_I
23b0: 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45  NT64 or.** P4_RE
23c0: 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  AL type..*/.int 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23e0: 34 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70  4Dup8(.  Vdbe *p
23f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2400: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
2410: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
2420: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
2430: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
2440: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
2450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2460: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
2470: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
2480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2490: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
24a0: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
24b0: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
24c0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
24d0: 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f   u8 *zP4,      /
24e0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
2500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
2510: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
2520: 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70  ){.  char *p4cop
2530: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
2540: 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33  locRawNN(sqlite3
2550: 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20  VdbeDb(p), 8);. 
2560: 20 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65   if( p4copy ) me
2570: 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34  mcpy(p4copy, zP4
2580: 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 8);.  return s
2590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25a0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
25b0: 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79  p3, p4copy, p4ty
25c0: 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  pe);.}..#ifndef 
25d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
25e0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AIN./*.** Return
25f0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2600: 74 68 65 20 63 75 72 72 65 6e 74 20 45 58 50 4c  the current EXPL
2610: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 62  AIN QUERY PLAN b
2620: 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20 6d 65  aseline..** 0 me
2630: 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69  ans "none"..*/.i
2640: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  nt sqlite3VdbeEx
2650: 70 6c 61 69 6e 50 61 72 65 6e 74 28 50 61 72 73  plainParent(Pars
2660: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
2670: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
2680: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2690: 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  lain==0 ) return
26a0: 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69   0;.  pOp = sqli
26b0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 50 61  te3VdbeGetOp(pPa
26c0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
26d0: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29  se->addrExplain)
26e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
26f0: 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  p2;.}../*.** Set
2700: 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
2710: 6b 70 6f 69 6e 74 20 6f 6e 20 74 68 65 20 66 6f  kpoint on the fo
2720: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
2730: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d  in order to.** m
2740: 6f 6e 69 74 6f 72 20 74 68 65 20 45 58 50 4c 41  onitor the EXPLA
2750: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2760: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a  de generation..*
2770: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
2780: 4c 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64  LITE_DEBUG).void
2790: 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42   sqlite3ExplainB
27a0: 72 65 61 6b 70 6f 69 6e 74 28 63 6f 6e 73 74 20  reakpoint(const 
27b0: 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20  char *z1, const 
27c0: 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 28 76 6f  char *z2){.  (vo
27d0: 69 64 29 7a 31 3b 0a 20 20 28 76 6f 69 64 29 7a  id)z1;.  (void)z
27e0: 32 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  2;.}.#endif../*.
27f0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f  ** Add a new OP_
2800: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
2810: 66 20 74 68 65 20 62 50 75 73 68 20 66 6c 61 67  f the bPush flag
2820: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d   is true, then m
2830: 61 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ake this opcode 
2840: 74 68 65 20 70 61 72 65 6e 74 20 66 6f 72 0a 2a  the parent for.*
2850: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 45 78 70  * subsequent Exp
2860: 6c 61 69 6e 73 20 75 6e 74 69 6c 20 73 71 6c 69  lains until sqli
2870: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f  te3VdbeExplainPo
2880: 70 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  p() is called..*
2890: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
28a0: 62 65 45 78 70 6c 61 69 6e 28 50 61 72 73 65 20  beExplain(Parse 
28b0: 2a 70 50 61 72 73 65 2c 20 75 38 20 62 50 75 73  *pParse, u8 bPus
28c0: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
28d0: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 23 69 66 6e 64  Fmt, ...){.#ifnd
28e0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28f0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 69 6e 63 6c    /* Always incl
2900: 75 64 65 20 74 68 65 20 4f 50 5f 45 78 70 6c 61  ude the OP_Expla
2910: 69 6e 20 6f 70 63 6f 64 65 73 20 69 66 20 53 51  in opcodes if SQ
2920: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
2930: 66 69 6e 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  fined..  ** But 
2940: 6f 6d 69 74 20 74 68 65 6d 20 28 66 6f 72 20 70  omit them (for p
2950: 65 72 66 6f 72 6d 61 6e 63 65 29 20 64 75 72 69  erformance) duri
2960: 6e 67 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75  ng production bu
2970: 69 6c 64 73 20 2a 2f 0a 20 20 69 66 28 20 70 50  ilds */.  if( pP
2980: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2990: 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
29a0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
29b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76    Vdbe *v;.    v
29c0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69  a_list ap;.    i
29d0: 6e 74 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61  nt iThis;.    va
29e0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
29f0: 3b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  ;.    zMsg = sql
2a00: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61  ite3VMPrintf(pPa
2a10: 72 73 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61  rse->db, zFmt, a
2a20: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
2a30: 70 29 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72  p);.    v = pPar
2a40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69  se->pVdbe;.    i
2a50: 54 68 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  This = v->nOp;. 
2a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a70: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
2a80: 69 6e 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73  in, iThis, pPars
2a90: 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  e->addrExplain, 
2aa0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2ab0: 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50           zMsg, P
2ac0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
2ad0: 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 72  sqlite3ExplainBr
2ae0: 65 61 6b 70 6f 69 6e 74 28 62 50 75 73 68 3f 22  eakpoint(bPush?"
2af0: 50 55 53 48 22 3a 22 22 2c 20 73 71 6c 69 74 65  PUSH":"", sqlite
2b00: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
2b10: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28  ->p4.z);.    if(
2b20: 20 62 50 75 73 68 29 7b 0a 20 20 20 20 20 20 70   bPush){.      p
2b30: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
2b40: 69 6e 20 3d 20 69 54 68 69 73 3b 0a 20 20 20 20  in = iThis;.    
2b50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2b60: 6f 70 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  op the EXPLAIN Q
2b70: 55 45 52 59 20 50 4c 41 4e 20 73 74 61 63 6b 20  UERY PLAN stack 
2b80: 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  one level..*/.vo
2b90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  id sqlite3VdbeEx
2ba0: 70 6c 61 69 6e 50 6f 70 28 50 61 72 73 65 20 2a  plainPop(Parse *
2bb0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
2bc0: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2bd0: 69 6e 74 28 22 50 4f 50 22 2c 20 30 29 3b 0a 20  int("POP", 0);. 
2be0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2bf0: 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64  lain = sqlite3Vd
2c00: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2c10: 70 50 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69  pParse);.}.#endi
2c20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c30: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a  _EXPLAIN */../*.
2c40: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
2c50: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
2c60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2c70: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
2c80: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
2c90: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
2ca0: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
2cb0: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
2cc0: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
2cd0: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
2ce0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
2cf0: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
2d00: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
2d10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2d20: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
2d30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
2d40: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
2d50: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
2d60: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
2d70: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
2d80: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
2d90: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
2da0: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
2db0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  j;.  sqlite3Vdbe
2dc0: 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72  AddOp4(p, OP_Par
2dd0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
2de0: 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f  , 0, zWhere, P4_
2df0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28  DYNAMIC);.  for(
2e00: 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44  j=0; j<p->db->nD
2e10: 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56  b; j++) sqlite3V
2e20: 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20  dbeUsesBtree(p, 
2e30: 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  j);.}../*.** Add
2e40: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
2e50: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
2e60: 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65  value as an inte
2e70: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e80: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2e90: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2ea0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2eb0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2ec0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
2ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2ee0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
2ef0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
2f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f10: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
2f20: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2f30: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2f40: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2f50: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2f60: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20   */.  int p4    
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f90: 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61   P4 operand as a
2fa0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a  n integer */.){.
2fb0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
2fd0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
2fe0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
2ff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
3000: 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  ){.    VdbeOp *p
3010: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
3020: 72 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  r];.    pOp->p4t
3030: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
3040: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
3050: 70 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p4;.  }.  return
3060: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73   addr;.}../* Ins
3070: 65 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ert the end of a
3080: 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76   co-routine.*/.v
3090: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
30a0: 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65  ndCoroutine(Vdbe
30b0: 20 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c   *v, int regYiel
30c0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d){.  sqlite3Vdb
30d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
30e0: 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  dCoroutine, regY
30f0: 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  ield);..  /* Cle
3100: 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ar the temporary
3110: 20 72 65 67 69 73 74 65 72 20 63 61 63 68 65 2c   register cache,
3120: 20 74 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e   thereby ensurin
3130: 67 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a  g that each.  **
3140: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20   co-routine has 
3150: 69 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64  its own independ
3160: 65 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69 73  ent set of regis
3170: 74 65 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f  ters, because co
3180: 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d  -routines.  ** m
3190: 69 67 68 74 20 65 78 70 65 63 74 20 74 68 65 69  ight expect thei
31a0: 72 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 62  r registers to b
31b0: 65 20 70 72 65 73 65 72 76 65 64 20 61 63 72 6f  e preserved acro
31c0: 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20  ss an OP_Yield, 
31d0: 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f  and.  ** that co
31e0: 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65  uld cause proble
31f0: 6d 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ms if two or mor
3200: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72  e co-routines ar
3210: 65 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  e using the same
3220: 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
3230: 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20  register..  */. 
3240: 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d   v->pParse->nTem
3250: 70 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70  pReg = 0;.  v->p
3260: 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
3270: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
3280: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
3290: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
32a0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
32b0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
32c0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
32d0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
32e0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
32f0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
3300: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
3310: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
3320: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
3330: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
3340: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
3350: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
3360: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
3370: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
3380: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
3390: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
33a0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
33b0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
33c0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
33d0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
33e0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
33f0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
3400: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
3410: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
3420: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
3430: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
3440: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
3450: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
3460: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
3470: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
3480: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
3490: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
34a0: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
34b0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
34c0: 65 64 2e 0a 2a 2a 20 28 4c 61 74 65 72 3a 29 20  ed..** (Later:) 
34d0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 74 72 75  This is only tru
34e0: 65 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 74 68  e for opcodes th
34f0: 61 74 20 68 61 76 65 20 74 68 65 20 4f 50 46 4c  at have the OPFL
3500: 47 5f 4a 55 4d 50 0a 2a 2a 20 70 72 6f 70 65 72  G_JUMP.** proper
3510: 74 79 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ty..**.** Variab
3520: 6c 65 20 75 73 61 67 65 20 6e 6f 74 65 73 3a 0a  le usage notes:.
3530: 2a 2a 0a 2a 2a 20 20 20 20 20 50 61 72 73 65 2e  **.**     Parse.
3540: 61 4c 61 62 65 6c 5b 78 5d 20 20 20 20 20 53 74  aLabel[x]     St
3550: 6f 72 65 73 20 74 68 65 20 61 64 64 72 65 73 73  ores the address
3560: 20 74 68 61 74 20 74 68 65 20 78 2d 74 68 20 6c   that the x-th l
3570: 61 62 65 6c 20 72 65 73 6f 6c 76 65 73 0a 2a 2a  abel resolves.**
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 20 20 20 20 20 20 20 69 6e 74 6f 2e 20 20           into.  
35a0: 46 6f 72 20 74 65 73 74 69 6e 67 20 28 53 51 4c  For testing (SQL
35b0: 49 54 45 5f 44 45 42 55 47 29 2c 20 75 6e 72 65  ITE_DEBUG), unre
35c0: 73 6f 6c 76 65 64 0a 2a 2a 20 20 20 20 20 20 20  solved.**       
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 6c 61 62 65 6c 73 20 73 74 6f 72 65 73 20    labels stores 
35f0: 2d 31 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  -1, but that is 
3600: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  not required..**
3610: 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61 62 65       Parse.nLabe
3620: 6c 41 6c 6c 6f 63 20 20 20 4e 75 6d 62 65 72 20  lAlloc   Number 
3630: 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  of slots allocat
3640: 65 64 20 74 6f 20 50 61 72 73 65 2e 61 4c 61 62  ed to Parse.aLab
3650: 65 6c 5b 5d 0a 2a 2a 20 20 20 20 20 50 61 72 73  el[].**     Pars
3660: 65 2e 6e 4c 61 62 65 6c 20 20 20 20 20 20 20 20  e.nLabel        
3670: 54 68 65 20 2a 6e 65 67 61 74 69 76 65 2a 20 6f  The *negative* o
3680: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
3690: 6c 61 62 65 6c 73 20 74 68 61 74 20 68 61 76 65  labels that have
36a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e              been
36c0: 20 69 73 73 75 65 64 2e 20 20 54 68 65 20 6e 65   issued.  The ne
36d0: 67 61 74 69 76 65 20 69 73 20 73 74 6f 72 65 64  gative is stored
36e0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 74 68 61 74 20 67 69 76 65 73 20 61      that gives a
3710: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
3720: 72 6f 76 65 6d 65 6e 74 20 6f 76 65 72 20 73 74  rovement over st
3730: 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oring.**        
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
3760: 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e 0a  positive value..
3770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3780: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 50 61 72 73  beMakeLabel(Pars
3790: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 72 65  e *pParse){.  re
37a0: 74 75 72 6e 20 2d 2d 70 50 61 72 73 65 2d 3e 6e  turn --pParse->n
37b0: 4c 61 62 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Label;.}../*.** 
37c0: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
37d0: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
37e0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
37f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
3800: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
3810: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
3820: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
3830: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3840: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
3850: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
3860: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 73 74 61  eLabel()..*/.sta
3870: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
3880: 49 4e 45 20 76 6f 69 64 20 72 65 73 69 7a 65 52  INE void resizeR
3890: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 50 61 72 73  esolveLabel(Pars
38a0: 65 20 2a 70 2c 20 56 64 62 65 20 2a 76 2c 20 69  e *p, Vdbe *v, i
38b0: 6e 74 20 6a 29 7b 0a 20 20 69 6e 74 20 6e 4e 65  nt j){.  int nNe
38c0: 77 53 69 7a 65 20 3d 20 31 30 20 2d 20 70 2d 3e  wSize = 10 - p->
38d0: 6e 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 61 4c 61  nLabel;.  p->aLa
38e0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52  bel = sqlite3DbR
38f0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e  eallocOrFree(p->
3900: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20  db, p->aLabel,. 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 6e 4e 65 77 53 69 7a 65 2a 73 69 7a      nNewSize*siz
3930: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
3940: 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61  ));.  if( p->aLa
3950: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  bel==0 ){.    p-
3960: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 30  >nLabelAlloc = 0
3970: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
3980: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3990: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
39a0: 72 28 69 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  r(i=p->nLabelAll
39b0: 6f 63 3b 20 69 3c 6e 4e 65 77 53 69 7a 65 3b 20  oc; i<nNewSize; 
39c0: 69 2b 2b 29 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  i++) p->aLabel[i
39d0: 5d 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20  ] = -1;.#endif. 
39e0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
39f0: 63 20 3d 20 6e 4e 65 77 53 69 7a 65 3b 0a 20 20  c = nNewSize;.  
3a00: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
3a10: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 76   v->nOp;.  }.}.v
3a20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
3a30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
3a40: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
3a50: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
3a60: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41  rse;.  int j = A
3a70: 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74  DDR(x);.  assert
3a80: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
3a90: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3aa0: 20 61 73 73 65 72 74 28 20 6a 3c 2d 70 2d 3e 6e   assert( j<-p->n
3ab0: 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Label );.  asser
3ac0: 74 28 20 6a 3e 3d 30 20 29 3b 0a 23 69 66 64 65  t( j>=0 );.#ifde
3ad0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3ae0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
3af0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
3b00: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
3b10: 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c 56 45   printf("RESOLVE
3b20: 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25 64 5c   LABEL %d to %d\
3b30: 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b 0a  n", x, v->nOp);.
3b40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
3b50: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
3b60: 2b 20 70 2d 3e 6e 4c 61 62 65 6c 20 3c 20 30 20  + p->nLabel < 0 
3b70: 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 52 65 73  ){.    resizeRes
3b80: 6f 6c 76 65 4c 61 62 65 6c 28 70 2c 76 2c 6a 29  olveLabel(p,v,j)
3b90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3ba0: 73 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c  ssert( p->aLabel
3bb0: 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  [j]==(-1) ); /* 
3bc0: 4c 61 62 65 6c 73 20 6d 61 79 20 6f 6e 6c 79 20  Labels may only 
3bd0: 62 65 20 72 65 73 6f 6c 76 65 64 20 6f 6e 63 65  be resolved once
3be0: 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   */.    p->aLabe
3bf0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
3c00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
3c10: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
3c20: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
3c30: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
3c40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3c50: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
3c60: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
3c70: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
3c80: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
3c90: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
3ca0: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
3cb0: 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  n multiple times
3cc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3cd0: 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 56 64  3VdbeReusable(Vd
3ce0: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e  be *p){.  p->run
3cf0: 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a  OnlyOnce = 0;.}.
3d00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
3d10: 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41  EBUG /* sqlite3A
3d20: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3d30: 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  logic */../*.** 
3d40: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  The following ty
3d50: 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20  pe and function 
3d60: 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65 72  are used to iter
3d70: 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
3d80: 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20  opcodes.** in a 
3d90: 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61  Vdbe main progra
3da0: 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68  m and each of th
3db0: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28  e sub-programs (
3dc0: 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61 79  triggers) it may
3dd0: 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65   .** invoke dire
3de0: 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74  ctly or indirect
3df0: 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  ly. It should be
3e00: 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73   used as follows
3e10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f  :.**.**   Op *pO
3e20: 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74  p;.**   VdbeOpIt
3e30: 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20  er sIter;.**.** 
3e40: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
3e50: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
3e60: 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76  ));.**   sIter.v
3e70: 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20 20   = v;           
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65   // v is of type
3ea0: 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69   Vdbe* .**   whi
3eb0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
3ec0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20 29  rNext(&sIter)) )
3ed0: 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73  {.**     // Do s
3ee0: 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f  omething with pO
3ef0: 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71  p.**   }.**   sq
3f00: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
3f10: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
3f20: 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20  .** .*/.typedef 
3f30: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
3f40: 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74  r VdbeOpIter;.st
3f50: 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20  ruct VdbeOpIter 
3f60: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  {.  Vdbe *v;    
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f80: 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61 74  * Vdbe to iterat
3f90: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70  e through the op
3fa0: 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75  codes of */.  Su
3fb0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
3fc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
3fd0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
3fe0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20   */.  int nSub; 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
4010: 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a  tries in apSub *
4020: 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20  /.  int iAddr;  
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4040: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
4050: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4060: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
4070: 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   iSub;          
4080: 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d          /* 0 = m
4090: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d  ain program, 1 =
40a0: 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72   first sub-progr
40b0: 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74  am etc. */.};.st
40c0: 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e  atic Op *opIterN
40d0: 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a  ext(VdbeOpIter *
40e0: 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  p){.  Vdbe *v = 
40f0: 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74  p->v;.  Op *pRet
4100: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b   = 0;.  Op *aOp;
4110: 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69  .  int nOp;..  i
4120: 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e  f( p->iSub<=p->n
4130: 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20  Sub ){..    if( 
4140: 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20  p->iSub==0 ){.  
4150: 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70      aOp = v->aOp
4160: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d  ;.      nOp = v-
4170: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >nOp;.    }else{
4180: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e  .      aOp = p->
4190: 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d  apSub[p->iSub-1]
41a0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
41b0: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
41c0: 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub-1]->nOp;.   
41d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
41e0: 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a  ->iAddr<nOp );..
41f0: 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b      pRet = &aOp[
4200: 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70  p->iAddr];.    p
4210: 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69  ->iAddr++;.    i
4220: 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70  f( p->iAddr==nOp
4230: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75   ){.      p->iSu
4240: 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41  b++;.      p->iA
4250: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ddr = 0;.    }. 
4260: 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e   .    if( pRet->
4270: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
4280: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69  OGRAM ){.      i
4290: 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e  nt nByte = (p->n
42a0: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
42b0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
42c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
42d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75  or(j=0; j<p->nSu
42e0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
42f0: 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d   if( p->apSub[j]
4300: 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  ==pRet->p4.pProg
4310: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
4320: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4330: 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20  ==p->nSub ){.   
4340: 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20       p->apSub = 
4350: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
4360: 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d  OrFree(v->db, p-
4370: 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a  >apSub, nByte);.
4380: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e          if( !p->
4390: 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  apSub ){.       
43a0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
43b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
43c0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70        p->apSub[p
43d0: 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74  ->nSub++] = pRet
43e0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
43f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
4410: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
4420: 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
4430: 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20   program stored 
4440: 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69  in the VM associ
4450: 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73 65  ated with pParse
4460: 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e   may.** throw an
4470: 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e   ABORT exception
4480: 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73 74   (causing the st
4490: 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  atement, but not
44a0: 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
44b0: 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c  ion.** to be rol
44c0: 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20  led back). This 
44d0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
44e0: 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72  e if the main pr
44f0: 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20  ogram or any.** 
4500: 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e  sub-programs con
4510: 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65  tains any of the
4520: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
4530: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77  *   *  OP_Halt w
4540: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
4550: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
4560: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
4570: 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20    OP_HaltIfNull 
4580: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
4590: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
45a0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
45b0: 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a  *  OP_Destroy.**
45c0: 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65     *  OP_VUpdate
45d0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e  .**   *  OP_VRen
45e0: 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46  ame.**   *  OP_F
45f0: 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32  kCounter with P2
4600: 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66  ==0 (immediate f
4610: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
4620: 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f  raint).**   *  O
4630: 50 5f 43 72 65 61 74 65 42 74 72 65 65 2f 42 54  P_CreateBtree/BT
4640: 52 45 45 5f 49 4e 54 4b 45 59 20 61 6e 64 20 4f  REE_INTKEY and O
4650: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
4660: 0a 2a 2a 20 20 20 20 20 20 28 66 6f 72 20 43 52  .**      (for CR
4670: 45 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45  EATE TABLE AS SE
4680: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
4690: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
46a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
46b0: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
46c0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
46d0: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
46e0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
46f0: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
4700: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
4710: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
4720: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
4730: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
4740: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
4750: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
4760: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
4770: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
4780: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
4790: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
47a0: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
47b0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
47c0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
47d0: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
47e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
47f0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
4800: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
4810: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
4820: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  bort = 0;.  int 
4830: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30  hasFkCounter = 0
4840: 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74  ;.  int hasCreat
4850: 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  eTable = 0;.  in
4860: 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  t hasInitCorouti
4870: 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  ne = 0;.  Op *pO
4880: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
4890: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
48a0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
48b0: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
48c0: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
48d0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
48e0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
48f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
4900: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
4910: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
4920: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
4930: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
4940: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
4950: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
4960: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 44  || opcode==OP_VD
4970: 65 73 74 72 6f 79 0a 20 20 20 20 20 7c 7c 20 28  estroy.     || (
4980: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
4990: 69 6f 6e 30 20 26 26 20 70 4f 70 2d 3e 70 34 2e  ion0 && pOp->p4.
49a0: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
49b0: 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 49 4e 54  &SQLITE_FUNC_INT
49c0: 45 52 4e 41 4c 29 0a 20 20 20 20 20 7c 7c 20 28  ERNAL).     || (
49d0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
49e0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
49f0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
4a00: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 29 21    && ((pOp->p1)!
4a10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4f  =SQLITE_OK && pO
4a20: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29  p->p2==OE_Abort)
4a30: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68  ).    ){.      h
4a40: 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20  asAbort = 1;.   
4a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4a60: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
4a70: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 26  OP_CreateBtree &
4a80: 26 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45  & pOp->p3==BTREE
4a90: 5f 49 4e 54 4b 45 59 20 29 20 68 61 73 43 72 65  _INTKEY ) hasCre
4aa0: 61 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ateTable = 1;.  
4ab0: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
4ac0: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29  _InitCoroutine )
4ad0: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
4ae0: 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  e = 1;.#ifndef S
4af0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
4b00: 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f  GN_KEY.    if( o
4b10: 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e  pcode==OP_FkCoun
4b20: 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d  ter && pOp->p1==
4b30: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 && pOp->p2==1 
4b40: 29 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f  ){.      hasFkCo
4b50: 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  unter = 1;.    }
4b60: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
4b70: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
4b80: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
4b90: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
4ba0: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
4bb0: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
4bc0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
4bd0: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
4be0: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
4bf0: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
4c00: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
4c10: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
4c20: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
4c30: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
4c40: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
4c50: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
4c60: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
4c70: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
4c80: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
4c90: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
4ca0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
4cb0: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
4cc0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
4cd0: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
4ce0: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
4cf0: 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73  =mayAbort || has
4d00: 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  FkCounter.      
4d10: 20 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43          || (hasC
4d20: 72 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61  reateTable && ha
4d30: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20  sInitCoroutine) 
4d40: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
4d50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
4d60: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
4d70: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
4d80: 6f 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  on */..#ifdef SQ
4d90: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
4da0: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
4db0: 57 72 69 74 65 20 63 6f 75 6e 74 65 72 20 69 6e  Write counter in
4dc0: 20 74 68 65 20 56 44 42 45 20 69 66 20 74 68 65   the VDBE if the
4dd0: 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 61   cursor is not a
4de0: 6e 0a 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 63  n.** ephemeral c
4df0: 75 72 73 6f 72 2c 20 6f 72 20 69 66 20 74 68 65  ursor, or if the
4e00: 20 63 75 72 73 6f 72 20 61 72 67 75 6d 65 6e 74   cursor argument
4e10: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69   is NULL..*/.voi
4e20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63  d sqlite3VdbeInc
4e30: 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28 56 64  rWriteCounter(Vd
4e40: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
4e50: 72 20 2a 70 43 29 7b 0a 20 20 69 66 28 20 70 43  r *pC){.  if( pC
4e60: 3d 3d 30 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65  ==0.   || (pC->e
4e70: 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45  CurType!=CURTYPE
4e80: 5f 53 4f 52 54 45 52 0a 20 20 20 20 20 20 20 26  _SORTER.       &
4e90: 26 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d  & pC->eCurType!=
4ea0: 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 0a 20  CURTYPE_PSEUDO. 
4eb0: 20 20 20 20 20 20 26 26 20 21 70 43 2d 3e 69 73        && !pC->is
4ec0: 45 70 68 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a  Ephemeral).  ){.
4ed0: 20 20 20 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b      p->nWrite++;
4ee0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
4ef0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4f00: 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20  UG./*.** Assert 
4f10: 69 66 20 61 6e 20 41 62 6f 72 74 20 61 74 20 74  if an Abort at t
4f20: 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  his point in tim
4f30: 65 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  e might result i
4f40: 6e 20 61 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64  n a corrupt.** d
4f50: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
4f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
4f70: 72 74 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65  rtAbortable(Vdbe
4f80: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4f90: 70 2d 3e 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  p->nWrite==0 || 
4fa0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
4fb0: 61 6c 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  al );.}.#endif..
4fc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4fd0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
4fe0: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
4ff0: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
5000: 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20  d.  It loops.** 
5010: 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
5020: 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65  opcodes and fixe
5030: 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c  s up some detail
5040: 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72  s..**.** (1) For
5050: 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72   each jump instr
5060: 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65  uction with a ne
5070: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
5080: 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20  (a label).**    
5090: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20   resolve the P2 
50a0: 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75  value to an actu
50b0: 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  al address..**.*
50c0: 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68  * (2) Compute th
50d0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
50e0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73   of arguments us
50f0: 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75  ed by any SQL fu
5100: 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e  nction.**     an
5110: 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c  d store that val
5120: 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41  ue in *pMaxFuncA
5130: 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55  rgs..**.** (3) U
5140: 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e 72  pdate the Vdbe.r
5150: 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65  eadOnly and Vdbe
5160: 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67 73  .bIsReader flags
5170: 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a   to accurately.*
5180: 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20 77  *     indicate w
5190: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
51a0: 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61   statement actua
51b0: 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  lly does..**.** 
51c0: 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  (4) Initialize t
51d0: 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70  he p4.xAdvance p
51e0: 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65  ointer on opcode
51f0: 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a  s that use it..*
5200: 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d  *.** (5) Reclaim
5210: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
5220: 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e  cated for storin
5230: 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20  g labels..**.** 
5240: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
5250: 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20  l only function 
5260: 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74 68 65  correctly if the
5270: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67   mkopcodeh.tcl g
5280: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69  enerator.** scri
5290: 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65 20 6f  pt numbers the o
52a0: 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74 6c 79  pcodes correctly
52b0: 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20 74 68  .  Changes to th
52c0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
52d0: 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65  be.** coordinate
52e0: 64 20 77 69 74 68 20 63 68 61 6e 67 65 73 20 74  d with changes t
52f0: 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e  o mkopcodeh.tcl.
5300: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5310: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
5320: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
5330: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
5340: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
5350: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
5360: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
5370: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
5380: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
5390: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
53a0: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
53b0: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
53c0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f  Reader = 0;.  pO
53d0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  p = &p->aOp[p->n
53e0: 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31  Op-1];.  while(1
53f0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  ){..    /* Only 
5400: 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61 6e 64  JUMP opcodes and
5410: 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73 74 20   the short list 
5420: 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63 6f 64  of special opcod
5430: 65 73 20 69 6e 20 74 68 65 20 73 77 69 74 63 68  es in the switch
5440: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65  .    ** below ne
5450: 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
5460: 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f  red.  The mkopco
5470: 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f  deh.tcl generato
5480: 72 20 73 63 72 69 70 74 20 67 72 6f 75 70 73 0a  r script groups.
5490: 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65      ** all these
54a0: 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74 68 65   opcodes togethe
54b0: 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f 6e 74  r near the front
54c0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 6c   of the opcode l
54d0: 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a  ist.  Skip.    *
54e0: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74 68 61  * any opcode tha
54f0: 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
5500: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 76 69  processing by vi
5510: 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66 61 63  rtual of the fac
5520: 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 74  t that.    ** it
5530: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
5540: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f  SQLITE_MX_JUMP_O
5550: 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65 72 66  PCODE, as a perf
5560: 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
5570: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
5580: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
5590: 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  <=SQLITE_MX_JUMP
55a0: 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20 20 20  _OPCODE ){.     
55b0: 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72   /* NOTE: Be sur
55c0: 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70  e to update mkop
55d0: 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61  codeh.tcl when a
55e0: 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e  dding or removin
55f0: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65 73  g.      ** cases
5600: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
5610: 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  h! */.      swit
5620: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
5630: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
5640: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20  OP_Transaction: 
5650: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
5660: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
5670: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
5680: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
5690: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20  thru */.        
56a0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
56b0: 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20  P_AutoCommit:.  
56c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
56d0: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
56e0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
56f0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
5700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5710: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
5720: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20  _OMIT_WAL.      
5730: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
5740: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
5750: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
5760: 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63 61 73  uum:.        cas
5770: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
5780: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  : {.          p-
5790: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
57a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52           p->bIsR
57b0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
57c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
57d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
57e0: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
57f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
5800: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
5810: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
5820: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
5830: 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  reeNext;.       
5840: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5850: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
5860: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
5870: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76  de generator nev
5880: 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20  er codes any of 
5890: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73  these opcodes as
58a0: 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20   a jump.        
58b0: 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e    ** to a label.
58c0: 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79    They are alway
58d0: 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d  s coded as a jum
58e0: 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61  p backwards to a
58f0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b   .          ** k
5900: 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  nown address */.
5910: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5920: 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
5930: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5950: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a     case OP_Prev:
5960: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
5970: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
5980: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
5990: 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 20 20  ious;.          
59a0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
59b0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
59c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
59d0: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
59e0: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
59f0: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5a00: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5a10: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
5a20: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
5a30: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
5a40: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
5a50: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
5a60: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
5a70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5a80: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
5a90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5aa0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
5ab0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
5ac0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
5ad0: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
5ae0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
5af0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
5b00: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
5b10: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
5b20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5b30: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5b40: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
5b50: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
5b60: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5b70: 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29  ( (pOp - p->aOp)
5b80: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
5b90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
5ba0: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
5bb0: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
5bc0: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
5bd0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
5be0: 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d   n>nMaxArgs ) nM
5bf0: 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20  axArgs = n;.    
5c00: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
5c10: 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 64  rough into the d
5c20: 65 66 61 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20  efault case */. 
5c30: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
5c40: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
5c50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
5c60: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
5c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5c80: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73   mkopcodeh.tcl s
5c90: 63 72 69 70 74 20 68 61 73 20 73 6f 20 61 72 72  cript has so arr
5ca0: 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74 68 61  anged things tha
5cb0: 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20  t the only.     
5cc0: 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75         ** non-ju
5cd0: 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20  mp opcodes less 
5ce0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
5cf0: 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61  UMP_CODE are gua
5d00: 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20  ranteed to.     
5d10: 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e         ** have n
5d20: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
5d30: 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20  es for P2. */.  
5d40: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5d50: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
5d60: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
5d70: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
5d80: 4d 50 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  MP)!=0 );.      
5d90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44        assert( AD
5da0: 44 52 28 70 4f 70 2d 3e 70 32 29 3c 2d 70 50 61  DR(pOp->p2)<-pPa
5db0: 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  rse->nLabel );. 
5dc0: 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
5dd0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52  p2 = aLabel[ADDR
5de0: 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20  (pOp->p2)];.    
5df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5e00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5e10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5e20: 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65   /* The mkopcode
5e30: 68 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73  h.tcl script has
5e40: 20 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69   so arranged thi
5e50: 6e 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c  ngs that the onl
5e60: 79 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a  y.      ** non-j
5e70: 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73  ump opcodes less
5e80: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f   than SQLITE_MX_
5e90: 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75  JUMP_CODE are gu
5ea0: 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
5eb0: 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65    ** have non-ne
5ec0: 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f  gative values fo
5ed0: 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61  r P2. */.      a
5ee0: 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f  ssert( (sqlite3O
5ef0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
5f00: 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47  p->opcode]&OPFLG
5f10: 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70  _JUMP)==0 || pOp
5f20: 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a  ->p2>=0);.    }.
5f30: 20 20 20 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e      if( pOp==p->
5f40: 61 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  aOp ) break;.   
5f50: 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71   pOp--;.  }.  sq
5f60: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
5f70: 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  b, pParse->aLabe
5f80: 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c  l);.  pParse->aL
5f90: 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72  abel = 0;.  pPar
5fa0: 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a  se->nLabel = 0;.
5fb0: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
5fc0: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73  = nMaxArgs;.  as
5fd0: 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
5fe0: 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41  er!=0 || DbMaskA
5ff0: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
6000: 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ask) );.}../*.**
6010: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
6020: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
6030: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
6040: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
6050: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
6060: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
6070: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
6080: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
6090: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
60a0: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
60b0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
60c0: 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f   at least N opco
60d0: 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61  de slots are ava
60e0: 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68  ilable in p with
60f0: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
6100: 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65   malloc for more
6110: 20 73 70 61 63 65 20 28 65 78 63 65 70 74 20 77   space (except w
6120: 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69  hen compiled usi
6130: 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  ng.** SQLITE_TES
6140: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
6150: 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 61  ).  This interfa
6160: 63 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  ce is used durin
6170: 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20  g testing.** to 
6180: 76 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74  verify that cert
6190: 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ain calls to sql
61a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
61b0: 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a  t() can never.**
61c0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f   fail due to a O
61d0: 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e  OM fault and hen
61e0: 63 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ce that the retu
61f0: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a  rn value from.**
6200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6210: 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77  pList() will alw
6220: 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e  ays be non-NULL.
6230: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
6240: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
6250: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6260: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
6270: 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74  RESS).void sqlit
6280: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
6290: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56 64 62  llocRequired(Vdb
62a0: 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  e *p, int N){.  
62b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b  assert( p->nOp +
62c0: 20 4e 20 3c 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f   N <= p->nOpAllo
62d0: 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  c );.}.#endif../
62e0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
62f0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
6300: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
6310: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ent does not con
6320: 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65  tain.** an OP_Re
6330: 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20  sultRow opcode. 
6340: 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28 29  Fail an assert()
6350: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68 69   if it does. Thi
6360: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79 20  s is used.** by 
6370: 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e 63  code in pragma.c
6380: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
6390: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
63a0: 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a  on of certain.**
63b0: 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74   pragmas comport
63c0: 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67 73  s with the flags
63d0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
63e0: 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74 63  e mkpragmatab.tc
63f0: 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a  l.** script..*/.
6400: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6410: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
6420: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
6430: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
6440: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
6450: 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
6460: 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Row(Vdbe *p){.  
6470: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6480: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
6490: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
64a0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
64b0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a  OP_ResultRow );.
64c0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
64d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
64e0: 65 20 28 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41  e (a single OP_A
64f0: 62 6f 72 74 61 62 6c 65 20 6f 70 63 6f 64 65 29  bortable opcode)
6500: 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65   that will.** ve
6510: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 56 44  rify that the VD
6520: 42 45 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 73  BE program can s
6530: 61 66 65 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74  afely call Abort
6540: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a   in the current.
6550: 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23  ** context..*/.#
6560: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6570: 45 5f 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71  E_DEBUG).void sq
6580: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 41  lite3VdbeVerifyA
6590: 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70  bortable(Vdbe *p
65a0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
65b0: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
65c0: 45 5f 41 62 6f 72 74 20 29 20 73 71 6c 69 74 65  E_Abort ) sqlite
65d0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
65e0: 50 5f 41 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a  P_Abortable);.}.
65f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
6600: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
6610: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
6620: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70   the array of op
6630: 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64  codes associated
6640: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62   with.** the Vdb
6650: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
6660: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
6670: 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
6680: 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
6690: 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66  .** to arrange f
66a0: 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  or the returned 
66b0: 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e  array to be even
66c0: 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69  tually freed usi
66d0: 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46  ng the .** vdbeF
66e0: 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e  reeOpArray() fun
66f0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  ction..**.** Bef
6700: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
6710: 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74  pnOp is set to t
6720: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
6730: 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75  ries in the retu
6740: 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41  rned.** array. A
6750: 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69  lso, *pnMaxArg i
6760: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72  s set to the lar
6770: 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65  ger of its curre
6780: 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a  nt value and .**
6790: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
67a0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64  ntries in the Vd
67b0: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
67c0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65   required to exe
67d0: 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74  cute the .** ret
67e0: 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a  urned program..*
67f0: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
6800: 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79  3VdbeTakeOpArray
6810: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
6820: 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41  nOp, int *pnMaxA
6830: 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61  rg){.  VdbeOp *a
6840: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61  Op = p->aOp;.  a
6850: 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70  ssert( aOp && !p
6860: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6870: 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ed );..  /* Chec
6880: 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64  k that sqlite3Vd
6890: 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61  beUsesBtree() wa
68a0: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20  s not called on 
68b0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73  this VM */.  ass
68c0: 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65  ert( DbMaskAllZe
68d0: 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  ro(p->btreeMask)
68e0: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
68f0: 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41  Values(p, pnMaxA
6900: 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70  rg);.  *pnOp = p
6910: 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20  ->nOp;.  p->aOp 
6920: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f  = 0;.  return aO
6930: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
6940: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
6950: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
6960: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
6970: 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20  k.  Return a.** 
6980: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
6990: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69  irst operation i
69a0: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  nserted..**.** N
69b0: 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67 75 6d  on-zero P2 argum
69c0: 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73  ents to jump ins
69d0: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 61 75  tructions are au
69e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64 6a 75  tomatically adju
69f0: 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20  sted.** so that 
6a00: 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65 74 20  the jump target 
6a10: 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74  is relative to t
6a20: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
6a30: 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  on inserted..*/.
6a40: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
6a50: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a 20 20  dbeAddOpList(.  
6a60: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a80: 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f 20 74  Add opcodes to t
6a90: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
6aa0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
6ab0: 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
6ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6ad0: 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f 20  r of opcodes to 
6ae0: 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c  add */.  VdbeOpL
6af0: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20  ist const *aOp, 
6b00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
6b10: 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64 65 64  odes to be added
6b20: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e   */.  int iLinen
6b30: 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
6b40: 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c     /* Source-fil
6b50: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  e line number of
6b60: 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f   first opcode */
6b70: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  .){.  int i;.  V
6b80: 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46  dbeOp *pOut, *pF
6b90: 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  irst;.  assert( 
6ba0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
6bb0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
6bc0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
6bd0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
6be0: 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  Op > p->nOpAlloc
6bf0: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
6c00: 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72  p, nOp) ){.    r
6c10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
6c20: 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26  First = pOut = &
6c30: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a  p->aOp[p->nOp];.
6c40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
6c50: 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f  ; i++, aOp++, pO
6c60: 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d  ut++){.    pOut-
6c70: 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f  >opcode = aOp->o
6c80: 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d  pcode;.    pOut-
6c90: 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20  >p1 = aOp->p1;. 
6ca0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f     pOut->p2 = aO
6cb0: 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72  p->p2;.    asser
6cc0: 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b  t( aOp->p2>=0 );
6cd0: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
6ce0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
6cf0: 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  aOp->opcode] & O
6d00: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
6d10: 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20   aOp->p2>0 ){.  
6d20: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20      pOut->p2 += 
6d30: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  p->nOp;.    }.  
6d40: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70    pOut->p3 = aOp
6d50: 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  ->p3;.    pOut->
6d60: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
6d70: 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  SED;.    pOut->p
6d80: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75  4.p = 0;.    pOu
6d90: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
6da0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6db0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
6dc0: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d  .    pOut->zComm
6dd0: 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ent = 0;.#endif.
6de0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
6df0: 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
6e00: 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  pOut->iSrcLine =
6e10: 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73   iLineno+i;.#els
6e20: 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e  e.    (void)iLin
6e30: 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  eno;.#endif.#ifd
6e40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6e50: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
6e60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
6e70: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
6e80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6e90: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d  ePrintOp(0, i+p-
6ea0: 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  >nOp, &p->aOp[i+
6eb0: 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a  p->nOp]);.    }.
6ec0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e  #endif.  }.  p->
6ed0: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65  nOp += nOp;.  re
6ee0: 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a  turn pFirst;.}..
6ef0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6f00: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
6f10: 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a  CANSTATUS)./*.**
6f20: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
6f30: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f   the array of co
6f40: 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62  unters managed b
6f50: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  y sqlite3_stmt_s
6f60: 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  canstatus()..*/.
6f70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6f80: 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
6f90: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6fb0: 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73   VM to add scans
6fc0: 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20  tatus() to */.  
6fd0: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c  int addrExplain,
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
7000: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
7010: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
7020: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
7030: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
7040: 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  of loop counter 
7050: 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69  */ .  int addrVi
7060: 73 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  sit,            
7070: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
7080: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
7090: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f   counter */.  Lo
70a0: 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20  gEst nEst,      
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70c0: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
70d0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
70e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
70f0: 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *zName         
7100: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7110: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
7120: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
7130: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
7140: 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a  = (p->nScan+1) *
7150: 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74   sizeof(ScanStat
7160: 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75  us);.  ScanStatu
7170: 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20  s *aNew;.  aNew 
7180: 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73  = (ScanStatus*)s
7190: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
71a0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c  p->db, p->aScan,
71b0: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61   nByte);.  if( a
71c0: 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53  New ){.    ScanS
71d0: 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61  tatus *pNew = &a
71e0: 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b  New[p->nScan++];
71f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45  .    pNew->addrE
7200: 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70  xplain = addrExp
7210: 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lain;.    pNew->
7220: 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c  addrLoop = addrL
7230: 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  oop;.    pNew->a
7240: 64 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56  ddrVisit = addrV
7250: 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  isit;.    pNew->
7260: 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20  nEst = nEst;.   
7270: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
7280: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
7290: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
72a0: 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65    p->aScan = aNe
72b0: 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  w;.  }.}.#endif.
72c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
72d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
72e0: 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50  opcode, or P1, P
72f0: 32 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65  2, P3, or P5 ope
7300: 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73  rands.** for a s
7310: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
7320: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7330: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
7340: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33  code(Vdbe *p, u3
7350: 32 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f  2 addr, u8 iNewO
7360: 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65  pcode){.  sqlite
7370: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
7380: 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65  r)->opcode = iNe
7390: 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20  wOpcode;.}.void 
73a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
73b0: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP1(Vdbe *p, u32
73c0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
73d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
73e0: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20  tOp(p,addr)->p1 
73f0: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
7400: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7410: 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  2(Vdbe *p, u32 a
7420: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
7430: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
7440: 70 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20  p(p,addr)->p2 = 
7450: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
7460: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
7470: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
7480: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
7490: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
74a0: 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61  p,addr)->p3 = va
74b0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
74c0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64  3VdbeChangeP5(Vd
74d0: 62 65 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a  be *p, u16 p5){.
74e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
74f0: 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  >0 || p->db->mal
7500: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
7510: 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d  f( p->nOp>0 ) p-
7520: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70  >aOp[p->nOp-1].p
7530: 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  5 = p5;.}../*.**
7540: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
7550: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
7560: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
7570: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
7580: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
7590: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
75a0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
75b0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
75c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
75d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
75e0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r){.  sqlite3Vdb
75f0: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
7600: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
7610: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
7620: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
7630: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
7640: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
7650: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
7660: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
7670: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
7680: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
7690: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
76a0: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
76b0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
76c0: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70  *pDef){.  if( (p
76d0: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
76e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
76f0: 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  EM)!=0 ){.    sq
7700: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
7710: 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pDef);.  }.}..
7720: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
7730: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
7740: 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74  te3 *, Op *, int
7750: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  );../*.** Delete
7760: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
7770: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
7780: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
7790: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d  INE void freeP4M
77a0: 65 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  em(sqlite3 *db, 
77b0: 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  Mem *p){.  if( p
77c0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
77d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
77e0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71  ->zMalloc);.  sq
77f0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
7800: 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53  , p);.}.static S
7810: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
7820: 6f 69 64 20 66 72 65 65 50 34 46 75 6e 63 43 74  oid freeP4FuncCt
7830: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  x(sqlite3 *db, s
7840: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7850: 70 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65  p){.  freeEpheme
7860: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
7870: 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69  p->pFunc);. sqli
7880: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
7890: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  p);.}.static voi
78a0: 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33  d freeP4(sqlite3
78b0: 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65   *db, int p4type
78c0: 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61  , void *p4){.  a
78d0: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73  ssert( db );.  s
78e0: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
78f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
7900: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72  CCTX: {.      fr
7910: 65 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20  eeP4FuncCtx(db, 
7920: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7930: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7940: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7950: 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20  se P4_REAL:.    
7960: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
7970: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
7980: 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  IC:.    case P4_
7990: 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73  DYNBLOB:.    cas
79a0: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
79b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
79c0: 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20  Free(db, p4);.  
79d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
79e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
79f0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 66  INFO: {.      if
7a00: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
7a10: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b  ed==0 ) sqlite3K
7a20: 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79  eyInfoUnref((Key
7a30: 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20  Info*)p4);.     
7a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7a50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7a60: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7a70: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
7a80: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7a90: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
7aa0: 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20  (Expr*)p4);.    
7ab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7ac0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
7ad0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
7ae0: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
7af0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75  Function(db, (Fu
7b00: 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20  ncDef*)p4);.    
7b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7b20: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
7b30: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
7b40: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
7b50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7b60: 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c  e3ValueFree((sql
7b70: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b  ite3_value*)p4);
7b80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7b90: 20 20 20 20 20 20 66 72 65 65 50 34 4d 65 6d 28        freeP4Mem(
7ba0: 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29 3b 0a 20  db, (Mem*)p4);. 
7bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7bc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7bd0: 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20  se P4_VTAB : {. 
7be0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
7bf0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
7c00: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
7c10: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
7c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c30: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7c40: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
7c50: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
7c60: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
7c70: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
7c80: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
7c90: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
7ca0: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
7cb0: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
7cc0: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
7cd0: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
7ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
7cf0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
7d00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
7d10: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
7d20: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
7d30: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
7d40: 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d  (pOp=&aOp[nOp-1]
7d50: 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d  ; pOp>=aOp; pOp-
7d60: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  -){.      if( pO
7d70: 70 2d 3e 70 34 74 79 70 65 20 3c 3d 20 50 34 5f  p->p4type <= P4_
7d80: 46 52 45 45 5f 49 46 5f 4c 45 20 29 20 66 72 65  FREE_IF_LE ) fre
7d90: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
7da0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
7db0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7dc0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
7dd0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
7de0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7df0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
7e00: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
7e10: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7e20: 65 65 4e 4e 28 64 62 2c 20 61 4f 70 29 3b 0a 20  eeNN(db, aOp);. 
7e30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b   }.}../*.** Link
7e40: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
7e50: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
7e60: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7e70: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
7e80: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
7e90: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
7ea0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
7eb0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
7ec0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
7ed0: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
7ee0: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
7ef0: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
7f00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
7f10: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
7f20: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
7f30: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
7f40: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
7f50: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
7f60: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
7f70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
7f80: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
7f90: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
7fa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
7fb0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
7fc0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
7fd0: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
7fe0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7ff0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
8000: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
8010: 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ( addr>=0 && add
8020: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f  r<p->nOp );.  pO
8030: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
8040: 5d 3b 0a 20 20 66 72 65 65 50 34 28 70 2d 3e 64  ];.  freeP4(p->d
8050: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
8060: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f  pOp->p4.p);.  pO
8070: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
8080: 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70  OTUSED;.  pOp->p
8090: 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  4.z = 0;.  pOp->
80a0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
80b0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
80c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
80d0: 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70  st opcode is "op
80e0: 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  " and it is not 
80f0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
8100: 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f  on,.** then remo
8110: 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74  ve it.  Return t
8120: 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  rue if and only 
8130: 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73  if an opcode was
8140: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
8150: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
8160: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
8170: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
8180: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26   if( p->nOp>0 &&
8190: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
81a0: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
81b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
81c0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
81d0: 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b  op(p, p->nOp-1);
81e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
81f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
8200: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
8210: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
8220: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
8230: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
8240: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
8250: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
8260: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
8270: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
8280: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
8290: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
82a0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
82b0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
82c0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
82d0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
82e0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
82f0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
8300: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
8310: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
8320: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
8330: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
8340: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
8350: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
8360: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
8370: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
8380: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
8390: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
83a0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
83b0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
83c0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
83d0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
83e0: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a  tes of zP4..** .
83f0: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
8400: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
8410: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
8420: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
8430: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
8440: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
8450: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
8460: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
8470: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
8480: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
8490: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
84a0: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
84b0: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
84c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
84d0: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
84e0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
84f0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
8500: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  struction..*/.st
8510: 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
8520: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68  _NOINLINE vdbeCh
8530: 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64  angeP4Full(.  Vd
8540: 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70  be *p,.  Op *pOp
8550: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
8560: 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a  zP4,.  int n.){.
8570: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
8580: 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28  e ){.    freeP4(
8590: 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  p->db, pOp->p4ty
85a0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
85b0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
85c0: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
85d0: 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  .p = 0;.  }.  if
85e0: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( n<0 ){.    sql
85f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
8600: 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  (p, (int)(pOp - 
8610: 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29  p->aOp), zP4, n)
8620: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
8630: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71  f( n==0 ) n = sq
8640: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
8650: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  4);.    pOp->p4.
8660: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  z = sqlite3DbStr
8670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c  NDup(p->db, zP4,
8680: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34   n);.    pOp->p4
8690: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
86a0: 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  C;.  }.}.void sq
86b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
86c0: 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  4(Vdbe *p, int a
86d0: 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ddr, const char 
86e0: 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *zP4, int n){.  
86f0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74  Op *pOp;.  sqlit
8700: 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74  e3 *db;.  assert
8710: 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
8720: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
8730: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
8740: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
8750: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21   assert( p->aOp!
8760: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
8770: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8780: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8790: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50   ){.    if( n!=P
87a0: 34 5f 56 54 41 42 20 29 20 66 72 65 65 50 34 28  4_VTAB ) freeP4(
87b0: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
87c0: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
87d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
87e0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
87f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
8800: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  dr<p->nOp );.  i
8810: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
8820: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
8830: 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   1;.  }.  pOp = 
8840: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
8850: 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70   if( n>=0 || pOp
8860: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
8870: 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c  vdbeChangeP4Full
8880: 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29  (p, pOp, zP4, n)
8890: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
88a0: 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  }.  if( n==P4_IN
88b0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
88c0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
88d0: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
88e0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
88f0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
8900: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
8910: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
8920: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
8930: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
8940: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
8950: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
8960: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
8970: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
8980: 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
8990: 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f  t( n<0 );.    pO
89a0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
89b0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
89c0: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
89d0: 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20  char)n;.    if( 
89e0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c  n==P4_VTAB ) sql
89f0: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
8a00: 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a  able*)zP4);.  }.
8a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
8a20: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6f  the P4 operand o
8a30: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
8a40: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
8a50: 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65  ction .** to the
8a60: 20 76 61 6c 75 65 20 64 65 66 69 6e 65 64 20 62   value defined b
8a70: 79 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e  y the arguments.
8a80: 20 20 54 68 69 73 20 69 73 20 61 20 68 69 67 68    This is a high
8a90: 2d 73 70 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f  -speed.** versio
8aa0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
8ab0: 43 68 61 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a  ChangeP4()..**.*
8ac0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
8ad0: 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20 62   must not have b
8ae0: 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64  een previously d
8af0: 65 66 69 6e 65 64 2e 20 20 41 6e 64 20 74 68 65  efined.  And the
8b00: 20 6e 65 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20   new.** P4 must 
8b10: 6e 6f 74 20 62 65 20 50 34 5f 49 4e 54 33 32 2e  not be P4_INT32.
8b20: 20 20 55 73 65 20 73 71 6c 69 74 65 33 56 64 62    Use sqlite3Vdb
8b30: 65 43 68 61 6e 67 65 50 34 28 29 20 69 6e 20 65  eChangeP4() in e
8b40: 69 74 68 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73  ither of.** thos
8b50: 65 20 63 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e cases..*/.void
8b60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
8b70: 6e 64 50 34 28 56 64 62 65 20 2a 70 2c 20 76 6f  ndP4(Vdbe *p, vo
8b80: 69 64 20 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b  id *pP4, int n){
8b90: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
8ba0: 20 20 61 73 73 65 72 74 28 20 6e 21 3d 50 34 5f    assert( n!=P4_
8bb0: 49 4e 54 33 32 20 26 26 20 6e 21 3d 50 34 5f 56  INT32 && n!=P4_V
8bc0: 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TAB );.  assert(
8bd0: 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   n<=0 );.  if( p
8be0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8bf0: 65 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34  ed ){.    freeP4
8c00: 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b  (p->db, n, pP4);
8c10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
8c20: 73 65 72 74 28 20 70 50 34 21 3d 30 20 29 3b 0a  sert( pP4!=0 );.
8c30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
8c40: 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70 20  Op>0 );.    pOp 
8c50: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
8c60: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
8c70: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
8c80: 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 20 20 20 20  _NOTUSED );.    
8c90: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b  pOp->p4type = n;
8ca0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
8cb0: 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   pP4;.  }.}../*.
8cc0: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
8cd0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8ce0: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
8cf0: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
8d00: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
8d10: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
8d20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
8d30: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
8d40: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
8d50: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
8d60: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8d70: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
8d80: 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  fo;.  assert( v!
8d90: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8da0: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65  pIdx!=0 );.  pKe
8db0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
8dc0: 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
8dd0: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 69  arse, pIdx);.  i
8de0: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 20 73 71  f( pKeyInfo ) sq
8df0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8e00: 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50  4(v, pKeyInfo, P
8e10: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23  4_KEYINFO);.}..#
8e20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8e30: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
8e40: 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ENTS./*.** Chang
8e50: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
8e60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8e70: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
8e80: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
8e90: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
8ea0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
8eb0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
8ec0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
8ed0: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
8ee0: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
8ef0: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
8f00: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
8f10: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
8f20: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
8f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8f40: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64   vdbeVComment(Vd
8f50: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
8f60: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
8f70: 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72  ist ap){.  asser
8f80: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
8f90: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
8fa0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
8fb0: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
8fc0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
8fd0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
8fe0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8ff0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->nOp ){.    as
9000: 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a  sert( p->aOp );.
9010: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9020: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b  e(p->db, p->aOp[
9030: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
9040: 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  nt);.    p->aOp[
9050: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
9060: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  nt = sqlite3VMPr
9070: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
9080: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a  mat, ap);.  }.}.
9090: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
90a0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
90b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
90c0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
90d0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
90e0: 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72  p ){.    va_star
90f0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
9100: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
9110: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
9120: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
9130: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
9140: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
9150: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
9160: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
9170: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
9180: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
9190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
91a0: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
91b0: 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  p);.    va_start
91c0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
91d0: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
91e0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
91f0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
9200: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
9210: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  * NDEBUG */..#if
9220: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
9230: 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53  COVERAGE./*.** S
9240: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20  et the value if 
9250: 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65  the iSrcLine fie
9260: 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ld for the previ
9270: 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ously coded inst
9280: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
9290: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c   sqlite3VdbeSetL
92a0: 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a  ineNumber(Vdbe *
92b0: 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20  v, int iLine){. 
92c0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
92d0: 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e  p(v,-1)->iSrcLin
92e0: 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e  e = iLine;.}.#en
92f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44  dif /* SQLITE_VD
9300: 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a  BE_COVERAGE */..
9310: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9320: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
9330: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
9340: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
9350: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
9360: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
9370: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
9380: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
9390: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
93a0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
93b0: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
93c0: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
93d0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
93e0: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
93f0: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
9400: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
9410: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
9420: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
9430: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
9440: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
9450: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
9460: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
9470: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
9480: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
9490: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
94a0: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
94b0: 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66  * after an OOM f
94c0: 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76  ault without hav
94d0: 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  ing to check to 
94e0: 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72  see if the retur
94f0: 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20  n from .** this 
9500: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c  routine is a val
9510: 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74  id pointer.  But
9520: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d   because the dum
9530: 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a  my.opcode is 0,.
9540: 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65  ** dummy will ne
9550: 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74  ver be written t
9560: 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69  o.  This is veri
9570: 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73  fied by code ins
9580: 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62  pection and.** b
9590: 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56  y running with V
95a0: 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65  algrind..*/.Vdbe
95b0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
95c0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
95d0: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
95e0: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
95f0: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
9600: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
9610: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
9620: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
9630: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
9640: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
9650: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
9660: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
9670: 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79  tic VdbeOp dummy
9680: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  ;  /* Ignore the
9690: 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62   MSVC warning ab
96a0: 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a  out no initializ
96b0: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
96c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
96d0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
96e0: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
96f0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
9700: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
9710: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
9720: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
9730: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9740: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
9750: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
9770: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
9780: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
9790: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
97a0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
97b0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
97c0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
97d0: 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  TS)./*.** Return
97e0: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
97f0: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
9800: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
9810: 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a  he opcode pOp.**
9820: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63   determined by c
9830: 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73  haracter c..*/.s
9840: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c  tatic int transl
9850: 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e  ateP(char c, con
9860: 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69  st Op *pOp){.  i
9870: 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75  f( c=='1' ) retu
9880: 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66  rn pOp->p1;.  if
9890: 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72  ( c=='2' ) retur
98a0: 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28  n pOp->p2;.  if(
98b0: 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e   c=='3' ) return
98c0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
98d0: 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20  c=='4' ) return 
98e0: 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74  pOp->p4.i;.  ret
98f0: 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a  urn pOp->p5;.}..
9900: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
9910: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22  string for the "
9920: 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f  comment" field o
9930: 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20  f a VDBE opcode 
9940: 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  listing..**.** T
9950: 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65  he Synopsis: fie
9960: 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69  ld in comments i
9970: 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  n the vdbe.c sou
9980: 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f  rce file gets co
9990: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e  nverted.** to an
99a0: 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68   extra string th
99b0: 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  at is appended t
99c0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63  o the sqlite3Opc
99d0: 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74  odeName().  In t
99e0: 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66  he.** absence of
99f0: 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c   other comments,
9a00: 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62   this synopsis b
9a10: 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65  ecomes the comme
9a20: 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65  nt on the opcode
9a30: 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c  ..** Some transl
9a40: 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a  ation occurs:.**
9a50: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20  .**       "PX"  
9a60: 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a      ->  "r[X]".*
9a70: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20  *       "PX@PY" 
9a80: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d    ->  "r[X..X+Y-
9a90: 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  1]"  or "r[x]" i
9aa0: 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a  f y is 0 or 1.**
9ab0: 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22         "PX@PY+1"
9ac0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22   ->  "r[X..X+Y]"
9ad0: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
9ae0: 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20   y is 0.**      
9af0: 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22   "PY..PY"  ->  "
9b00: 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72  r[X..Y]"      or
9b10: 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a   "r[x]" if y<=x.
9b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
9b30: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20  splayComment(.  
9b40: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20  const Op *pOp,  
9b50: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
9b60: 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64   to be commented
9b70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9b80: 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76   *zP4,   /* Prev
9b90: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
9ba0: 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a  value for P4 */.
9bb0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20    char *zTemp,  
9bc0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
9bd0: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  sult here */.  i
9be0: 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20  nt nTemp        
9bf0: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
9c00: 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20  able in zTemp[] 
9c10: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
9c20: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63  ar *zOpName;.  c
9c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f  onst char *zSyno
9c40: 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e  psis;.  int nOpN
9c50: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  ame;.  int ii, j
9c60: 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74 5b 35  j;.  char zAlt[5
9c70: 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  0];.  zOpName = 
9c80: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
9c90: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a  e(pOp->opcode);.
9ca0: 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    nOpName = sqli
9cb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e  te3Strlen30(zOpN
9cc0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e  ame);.  if( zOpN
9cd0: 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29  ame[nOpName+1] )
9ce0: 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f  {.    int seenCo
9cf0: 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  m = 0;.    char 
9d00: 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73  c;.    zSynopsis
9d10: 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f   = zOpName += nO
9d20: 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69  pName + 1;.    i
9d30: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
9d40: 70 73 69 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30  psis,"IF ",3)==0
9d50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
9d60: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
9d70: 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20  TOREP2 ){.      
9d80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9d90: 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c  tf(sizeof(zAlt),
9da0: 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20   zAlt, "r[P2] = 
9db0: 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73  (%s)", zSynopsis
9dc0: 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +3);.      }else
9dd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9de0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
9df0: 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22  f(zAlt), zAlt, "
9e00: 69 66 20 25 73 20 67 6f 74 6f 20 50 32 22 2c 20  if %s goto P2", 
9e10: 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20  zSynopsis+3);.  
9e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e      }.      zSyn
9e30: 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20  opsis = zAlt;.  
9e40: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a    }.    for(ii=j
9e50: 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20  j=0; jj<nTemp-1 
9e60: 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69  && (c = zSynopsi
9e70: 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29  s[ii])!=0; ii++)
9e80: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  {.      if( c=='
9e90: 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  P' ){.        c 
9ea0: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69  = zSynopsis[++ii
9eb0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ];.        if( c
9ec0: 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20  =='4' ){.       
9ed0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9ee0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
9ef0: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50  emp+jj, "%s", zP
9f00: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
9f10: 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a  e if( c=='X' ){.
9f20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9f30: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9f40: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
9f50: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
9f60: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
9f70: 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  eenCom = 1;.    
9f80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9f90: 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72       int v1 = tr
9fa0: 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29  anslateP(c, pOp)
9fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
9fc0: 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v2;.          sq
9fd0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9fe0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
9ff0: 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20  j, "%d", v1);.  
a000: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
a010: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
a020: 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20  +1, "@P", 2)==0 
a030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
a040: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  i += 3;.        
a050: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
a060: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
a070: 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  jj);.           
a080: 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v2 = translateP
a090: 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20  (zSynopsis[ii], 
a0a0: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
a0b0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
a0c0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31  ynopsis+ii+1,"+1
a0d0: 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
a0e0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32           ii += 2
a0f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a100: 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  v2++;.          
a110: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a120: 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20  if( v2>1 ){.    
a130: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a140: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
a150: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
a160: 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b  ..%d", v1+v2-1);
a170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
a180: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
a190: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
a1a0: 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33  psis+ii+1, "..P3
a1b0: 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d  ", 4)==0 && pOp-
a1c0: 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p3==0 ){.      
a1d0: 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20        ii += 4;. 
a1e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a1f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20     }.        jj 
a200: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
a210: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
a220: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a230: 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d     zTemp[jj++] =
a240: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   c;.      }.    
a250: 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43  }.    if( !seenC
a260: 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35  om && jj<nTemp-5
a270: 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e   && pOp->zCommen
a280: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
a290: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
a2a0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
a2b0: 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  "; %s", pOp->zCo
a2c0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a  mment);.      jj
a2d0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
a2e0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
a2f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c     }.    if( jj<
a300: 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a  nTemp ) zTemp[jj
a310: 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  ] = 0;.  }else i
a320: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
a330: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a340: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
a350: 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70  zTemp, "%s", pOp
a360: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
a370: 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72   jj = sqlite3Str
a380: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
a390: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70  }else{.    zTemp
a3a0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20  [0] = 0;.    jj 
a3b0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
a3c0: 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n jj;.}.#endif /
a3d0: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
a3e0: 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50  /..#if VDBE_DISP
a3f0: 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65  LAY_P4 && define
a400: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
a410: 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a  CURSOR_HINTS)./*
a420: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68  .** Translate th
a430: 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75 65  e P4.pExpr value
a440: 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f   for an OP_Curso
a450: 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74  rHint opcode int
a460: 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20 63  o text.** that c
a470: 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64 20  an be displayed 
a480: 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e  in the P4 column
a490: 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74 70   of EXPLAIN outp
a4a0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ut..*/.static vo
a4b0: 69 64 20 64 69 73 70 6c 61 79 50 34 45 78 70 72  id displayP4Expr
a4c0: 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45 78  (StrAccum *p, Ex
a4d0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f  pr *pExpr){.  co
a4e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
a4f0: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
a500: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
a510: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
a520: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a530: 61 70 70 65 6e 64 66 28 70 2c 20 22 25 51 22 2c  appendf(p, "%Q",
a540: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
a550: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a560: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
a570: 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  GER:.      sqlit
a580: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
a590: 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75  , "%d", pExpr->u
a5a0: 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  .iValue);.      
a5b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a5c0: 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73  TK_NULL:.      s
a5d0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a5e0: 64 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  df(p, "NULL");. 
a5f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a600: 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
a610: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a620: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c  3_str_appendf(p,
a630: 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d   "r[%d]", pExpr-
a640: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
a650: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a660: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
a670: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
a680: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
a690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a6a0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a6b0: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
a6c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
a6d0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a6e0: 64 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e  df(p, "c%d", (in
a6f0: 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  t)pExpr->iColumn
a700: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a720: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
a730: 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20     zOp = "LT";  
a740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a750: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
a760: 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  zOp = "LE";     
a770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a780: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70   TK_GT:      zOp
a790: 20 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62 72   = "GT";      br
a7a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a7b0: 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _GE:      zOp = 
a7c0: 22 47 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "GE";      break
a7d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  ;.    case TK_NE
a7e0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45  :      zOp = "NE
a7f0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a800: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
a810: 20 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20      zOp = "EQ"; 
a820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a830: 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20  case TK_IS:     
a840: 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20   zOp = "IS";    
a850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a860: 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f  e TK_ISNOT:   zO
a870: 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62  p = "ISNOT";   b
a880: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a890: 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d  K_AND:     zOp =
a8a0: 20 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61   "AND";     brea
a8b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  k;.    case TK_O
a8c0: 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f  R:      zOp = "O
a8d0: 52 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R";      break;.
a8e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
a8f0: 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22  :    zOp = "ADD"
a900: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a910: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20   case TK_STAR:  
a920: 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20    zOp = "MUL";  
a930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a940: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a  se TK_MINUS:   z
a950: 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20  Op = "SUB";     
a960: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a970: 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20  TK_REM:     zOp 
a980: 3d 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65  = "REM";     bre
a990: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a9a0: 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22  BITAND:  zOp = "
a9b0: 42 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b  BITAND";  break;
a9c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a9d0: 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54  OR:   zOp = "BIT
a9e0: 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OR";   break;.  
a9f0: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
aa00: 20 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20     zOp = "DIV"; 
aa10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
aa20: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20  ase TK_LSHIFT:  
aa30: 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  zOp = "LSHIFT"; 
aa40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
aa50: 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70   TK_RSHIFT:  zOp
aa60: 20 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62 72   = "RSHIFT";  br
aa70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
aa80: 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20  _CONCAT:  zOp = 
aa90: 22 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b  "CONCAT";  break
aaa0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  ;.    case TK_UM
aab0: 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49  INUS:  zOp = "MI
aac0: 4e 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  NUS";   break;. 
aad0: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
aae0: 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22  :   zOp = "PLUS"
aaf0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
ab00: 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
ab10: 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b   zOp = "BITNOT";
ab20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ab30: 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f  e TK_NOT:     zO
ab40: 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62  p = "NOT";     b
ab50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
ab60: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d  K_ISNULL:  zOp =
ab70: 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61   "ISNULL";  brea
ab80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
ab90: 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e  OTNULL: zOp = "N
aba0: 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  OTNULL"; break;.
abb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
abc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
abd0: 61 70 70 65 6e 64 66 28 70 2c 20 22 25 73 22 2c  appendf(p, "%s",
abe0: 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20   "expr");.      
abf0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
ac00: 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  ( zOp ){.    sql
ac10: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
ac20: 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b  (p, "%s(", zOp);
ac30: 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78  .    displayP4Ex
ac40: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pr(p, pExpr->pLe
ac50: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ft);.    if( pEx
ac60: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
ac70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
ac80: 61 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31  append(p, ",", 1
ac90: 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  );.      display
aca0: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
acb0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
acc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
acd0: 61 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31  append(p, ")", 1
ace0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
acf0: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
ad00: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
ad10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
ad20: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
ad30: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
ad40: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
ad50: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
ad60: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
ad70: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
ad80: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
ad90: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
ada0: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
adb0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
adc0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
add0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
ade0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
adf0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
ae00: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
ae10: 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20    StrAccum x;.  
ae20: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
ae30: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  0 );.  sqlite3St
ae40: 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30  rAccumInit(&x, 0
ae50: 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20  , zTemp, nTemp, 
ae60: 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f  0);.  switch( pO
ae70: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
ae80: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
ae90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  : {.      int j;
aea0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
aeb0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
aec0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
aed0: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
aee0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
aef0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
af00: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
af10: 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  &x, "k(%d", pKey
af20: 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29  Info->nKeyField)
af30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
af40: 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65   j<pKeyInfo->nKe
af50: 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  yField; j++){.  
af60: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
af70: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
af80: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
af90: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
afa0: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
afb0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  Coll->zName : ""
afc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
afd0: 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e  rcmp(zColl, "BIN
afe0: 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c  ARY")==0 ) zColl
aff0: 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20   = "B";.        
b000: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b010: 6e 64 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c  ndf(&x, ",%s%s",
b020: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b030: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
b040: 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a  Order[j] ? "-" :
b050: 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20   "", zColl);.   
b060: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b070: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78  e3_str_append(&x
b080: 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ")", 1);.     
b090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b0a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b0b0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
b0c0: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
b0d0: 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  : {.      displa
b0e0: 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d  yP4Expr(&x, pOp-
b0f0: 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  >p4.pExpr);.    
b100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b110: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
b120: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
b130: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
b140: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
b150: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
b160: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b170: 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c   "(%.20s)", pCol
b180: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
b190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b1a0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
b1b0: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
b1c0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
b1d0: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
b1e0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b1f0: 6e 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22  ndf(&x, "%s(%d)"
b200: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
b210: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
b220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b230: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b240: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
b250: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
b260: 29 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  ).    case P4_FU
b270: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46  NCCTX: {.      F
b280: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
b290: 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75  Op->p4.pCtx->pFu
b2a0: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
b2b0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b2c0: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
b2d0: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
b2e0: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
b2f0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b300: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
b310: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
b320: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b330: 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  x, "%lld", *pOp-
b340: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
b350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b360: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
b370: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b380: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b390: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
b3a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b3b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
b3c0: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
b3d0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b3e0: 6e 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ndf(&x, "%.16g",
b3f0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
b400: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b410: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b420: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
b430: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
b440: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66  4.pMem;.      if
b450: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
b460: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
b470: 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a     zP4 = pMem->z
b480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
b490: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
b4a0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
b4b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b4c0: 70 70 65 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64  ppendf(&x, "%lld
b4d0: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20  ", pMem->u.i);. 
b4e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
b4f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
b500: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Real ){.       
b510: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b520: 65 6e 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22  endf(&x, "%.16g"
b530: 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20  , pMem->u.r);.  
b540: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
b550: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
b560: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
b570: 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20  zP4 = "NULL";.  
b580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b590: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
b5a0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
b5b0: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
b5c0: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
b5d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
b5e0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
b5f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
b600: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
b610: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
b620: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
b630: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
b640: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
b650: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b660: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 76 74  _appendf(&x, "vt
b670: 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a  ab:%p", pVtab);.
b680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b690: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
b6a0: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
b6b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
b6c0: 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70       int *ai = p
b6d0: 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20  Op->p4.ai;.     
b6e0: 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20   int n = ai[0]; 
b6f0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65    /* The first e
b700: 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54  lement of an INT
b710: 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20  ARRAY is always 
b720: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
b730: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f             ** co
b740: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
b750: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f  r of elements to
b760: 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20   follow */.     
b770: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20   for(i=1; i<=n; 
b780: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
b790: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b7a0: 66 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b  f(&x, ",%d", ai[
b7b0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
b7c0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b     zTemp[0] = '[
b7d0: 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ';.      sqlite3
b7e0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20  _str_append(&x, 
b7f0: 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  "]", 1);.      b
b800: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b810: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
b820: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
b830: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b840: 26 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  &x, "program");.
b850: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b860: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44   }.    case P4_D
b870: 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65  YNBLOB:.    case
b880: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
b890: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
b8a0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
b8b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
b8c0: 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  4_TABLE: {.     
b8d0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b8e0: 65 6e 64 66 28 26 78 2c 20 22 25 73 22 2c 20 70  endf(&x, "%s", p
b8f0: 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61  Op->p4.pTab->zNa
b900: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
b910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
b920: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
b930: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
b940: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29      if( zP4==0 )
b950: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
b960: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
b970: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
b980: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
b990: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
b9a0: 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73  Finish(&x);.  as
b9b0: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
b9c0: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
b9d0: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
b9e0: 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a  ISPLAY_P4 */../*
b9f0: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
ba00: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
ba10: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
ba20: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
ba30: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  sed..**.** The p
ba40: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ba50: 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ts need to know 
ba60: 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63  in advance the c
ba70: 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a  omplete set of.*
ba80: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
ba90: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ases that will b
baa0: 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f  e use.  A mask o
bab0: 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65  f these database
bac0: 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e  s.** is maintain
bad0: 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ed in p->btreeMa
bae0: 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b  sk.  The p->lock
baf0: 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68  Mask value is th
bb00: 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70  e subset of.** p
bb10: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64  ->btreeMask of d
bb20: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
bb30: 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63  ll require a loc
bb40: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
bb50: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
bb60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b  Vdbe *p, int i){
bb70: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
bb80: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
bb90: 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  && i<(int)sizeof
bba0: 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  (yDbMask)*8 );. 
bbb0: 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29   assert( i<(int)
bbc0: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
bbd0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61  ask)*8 );.  DbMa
bbe0: 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61  skSet(p->btreeMa
bbf0: 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21  sk, i);.  if( i!
bc00: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
bc10: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
bc20: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
bc30: 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
bc40: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a  ->lockMask, i);.
bc50: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
bc60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bc70: 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a  SHARED_CACHE)./*
bc80: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
bc90: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70   compiled to sup
bca0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
bcb0: 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65  e mode and to be
bcc0: 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20   threadsafe,.** 
bcd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74  this routine obt
bce0: 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61  ains the mutex a
bcf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
bd00: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
bd10: 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d  ucture.** that m
bd20: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ay be accessed b
bd30: 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
bd40: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
bd50: 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61  In doing so it a
bd60: 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  lso.** sets the 
bd70: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
bd80: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
bd90: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
bda0: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
bdb0: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
bdc0: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
bdd0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
bde0: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
bdf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
be00: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
be10: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
be20: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
be30: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
be40: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
be50: 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  r() is invoked t
be60: 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72  o set the BtShar
be70: 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a  ed.db variables.
be80: 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53  ** of all of BtS
be90: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
bea0: 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20   accessible via 
beb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
bec0: 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74  dle .** associat
bed0: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a  ed with the VM..
bee0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
bef0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
bf00: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73  e and does not s
bf10: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
bf20: 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a  che mode, this.*
bf30: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
bf40: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
bf50: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69   p->btreeMask fi
bf60: 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b  eld is a bitmask
bf70: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74   of all btrees t
bf80: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
bf90: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70   .** statement p
bfa0: 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20   will ever use. 
bfb0: 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75   Let N be the nu
bfc0: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
bfd0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20  p->btreeMask.** 
bfe0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
bff0: 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65   btrees that use
c000: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
c010: 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65  Then the runtime
c020: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   of.** this rout
c030: 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74  ine is N*N.  But
c040: 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20   as N is rarely 
c050: 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69  more than 1, thi
c060: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  s should not.** 
c070: 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
c080: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c090: 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  eEnter(Vdbe *p){
c0a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
c0b0: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
c0c0: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
c0d0: 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   if( DbMaskAllZe
c0e0: 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20  ro(p->lockMask) 
c0f0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
c100: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
c110: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
c120: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
c130: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
c140: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
c150: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
c160: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
c170: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
c180: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
c190: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
c1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
c1b0: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42  eEnter(aDb[i].pB
c1c0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
c1d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
c1e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c1f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
c200: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
c210: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  AFE>0./*.** Unlo
c220: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74  ck all of the bt
c230: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20  rees previously 
c240: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c  locked by a call
c250: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
c260: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  nter()..*/.stati
c270: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
c280: 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65  E void vdbeLeave
c290: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
c2a0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
c2b0: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
c2c0: 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20  int nDb;.  db = 
c2d0: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
c2e0: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
c2f0: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
c300: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
c310: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
c320: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
c330: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
c340: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
c350: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
c360: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61  ite3BtreeLeave(a
c370: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
c380: 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
c390: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
c3a0: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62  be *p){.  if( Db
c3b0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
c3c0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
c3d0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
c3e0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65  n case */.  vdbe
c3f0: 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64  Leave(p);.}.#end
c400: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
c410: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
c420: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
c430: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
c440: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
c450: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
c460: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
c470: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
c480: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c490: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
c4a0: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 56 64 62  Out, int pc, Vdb
c4b0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61  eOp *pOp){.  cha
c4c0: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
c4d0: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
c4e0: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
c4f0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
c500: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
c510: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
c520: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
c530: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
c540: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
c550: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
c560: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
c570: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
c580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c590: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
c5a0: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
c5b0: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
c5c0: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
c5d0: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
c5e0: 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  m[0] = 0;.#endif
c5f0: 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73  .  /* NB:  The s
c600: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
c610: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  () function is i
c620: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f  mplemented by co
c630: 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20  de created.  ** 
c640: 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  by the mkopcodeh
c650: 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64  .awk and mkopcod
c660: 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77  ec.awk scripts w
c670: 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65  hich extract the
c680: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
c690: 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e  n from the vdbe.
c6a0: 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f  c source text */
c6b0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
c6c0: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
c6d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
c6e0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
c6f0: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
c700: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
c710: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20   zP4, pOp->p5,. 
c720: 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20       zCom.  );. 
c730: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
c740: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c750: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72  nitialize an arr
c760: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
c770: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
c780: 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79  oid initMemArray
c790: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20  (Mem *p, int N, 
c7a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36  sqlite3 *db, u16
c7b0: 20 66 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65   flags){.  while
c7c0: 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20  ( (N--)>0 ){.   
c7d0: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
c7e0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67   p->flags = flag
c7f0: 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c  s;.    p->szMall
c800: 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  oc = 0;.#ifdef S
c810: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
c820: 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20  p->pScopyFrom = 
c830: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b  0;.#endif.    p+
c840: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
c850: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
c860: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
c870: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
c880: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
c890: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
c8a0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
c8b0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
c8c0: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
c8d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c8e0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
c8f0: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
c900: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
c910: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
c920: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
c930: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
c940: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
c950: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
c960: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
c970: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
c980: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
c990: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
c9a0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
c9b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c9c0: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
c9d0: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
c9e0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
c9f0: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
ca00: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
ca10: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
ca20: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
ca30: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
ca40: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
ca50: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
ca60: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
ca70: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
ca80: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
ca90: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
caa0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
cab0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
cac0: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
cad0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
cae0: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
caf0: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
cb00: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
cb10: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
cb20: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
cb30: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
cb40: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
cb50: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
cb60: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
cb70: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
cb80: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
cb90: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
cba0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
cbb0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
cbc0: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
cbd0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
cbe0: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
cbf0: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
cc00: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
cc10: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
cc20: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
cc30: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
cc40: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
cc50: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
cc60: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
cc70: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
cc80: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
cc90: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
cca0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
ccb0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
ccc0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
ccd0: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
cce0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
ccf0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
cd00: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
cd10: 65 28 20 70 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69  e( p->xDel==sqli
cd20: 74 65 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44  te3VdbeFrameMemD
cd30: 65 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  el );.      if( 
cd40: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67  p->flags&(MEM_Ag
cd50: 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20  g|MEM_Dyn) ){.  
cd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd70: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
cd80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cd90: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
cda0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
cdb0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d  FreeNN(db, p->zM
cdc0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
cdd0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
cde0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cdf0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
ce00: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
ce10: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
ce20: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65   );.  }.}..#ifde
ce30: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
ce40: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
ce50: 20 70 46 72 61 6d 65 20 69 73 20 61 20 76 61 6c   pFrame is a val
ce60: 69 64 20 56 64 62 65 46 72 61 6d 65 20 70 6f 69  id VdbeFrame poi
ce70: 6e 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 72  nter.  Return tr
ce80: 75 65 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 61  ue if it is.** a
ce90: 6e 64 20 66 61 6c 73 65 20 69 66 20 73 6f 6d 65  nd false if some
cea0: 74 68 69 6e 67 20 69 73 20 77 72 6f 6e 67 2e 0a  thing is wrong..
ceb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
cec0: 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66  ne is intended f
ced0: 6f 72 20 75 73 65 20 69 6e 73 69 64 65 20 6f 66  or use inside of
cee0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
cef0: 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ents only..*/.in
cf00: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
cf10: 6d 65 49 73 56 61 6c 69 64 28 56 64 62 65 46 72  meIsValid(VdbeFr
cf20: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
cf30: 69 66 28 20 70 46 72 61 6d 65 2d 3e 69 46 72 61  if( pFrame->iFra
cf40: 6d 65 4d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f  meMagic!=SQLITE_
cf50: 46 52 41 4d 45 5f 4d 41 47 49 43 20 29 20 72 65  FRAME_MAGIC ) re
cf60: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
cf70: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   1;.}.#endif.../
cf80: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64  *.** This is a d
cf90: 65 73 74 72 75 63 74 6f 72 20 6f 6e 20 61 20 4d  estructor on a M
cfa0: 65 6d 20 6f 62 6a 65 63 74 20 28 77 68 69 63 68  em object (which
cfb0: 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 73 71   is really an sq
cfc0: 6c 69 74 65 33 5f 76 61 6c 75 65 29 0a 2a 2a 20  lite3_value).** 
cfd0: 74 68 61 74 20 64 65 6c 65 74 65 73 20 74 68 65  that deletes the
cfe0: 20 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 74 68   Frame object th
cff0: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
d000: 6f 20 69 74 20 61 73 20 61 20 62 6c 6f 62 2e 0a  o it as a blob..
d010: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d020: 6e 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 6c 65  ne does not dele
d030: 74 65 20 74 68 65 20 46 72 61 6d 65 20 72 69 67  te the Frame rig
d040: 68 74 20 61 77 61 79 2e 20 20 49 74 20 6d 65 72  ht away.  It mer
d050: 65 6c 79 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ely adds the.** 
d060: 66 72 61 6d 65 20 74 6f 20 61 20 6c 69 73 74 20  frame to a list 
d070: 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 62 65 20  of frames to be 
d080: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
d090: 20 56 64 62 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a   Vdbe halts..*/.
d0a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
d0b0: 46 72 61 6d 65 4d 65 6d 44 65 6c 28 76 6f 69 64  FrameMemDel(void
d0c0: 20 2a 70 41 72 67 29 7b 0a 20 20 56 64 62 65 46   *pArg){.  VdbeF
d0d0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 28  rame *pFrame = (
d0e0: 56 64 62 65 46 72 61 6d 65 2a 29 70 41 72 67 3b  VdbeFrame*)pArg;
d0f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d100: 65 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c  e3VdbeFrameIsVal
d110: 69 64 28 70 46 72 61 6d 65 29 20 29 3b 0a 20 20  id(pFrame) );.  
d120: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20  pFrame->pParent 
d130: 3d 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65  = pFrame->v->pDe
d140: 6c 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65  lFrame;.  pFrame
d150: 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d  ->v->pDelFrame =
d160: 20 70 46 72 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a   pFrame;.}.../*.
d170: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
d180: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
d190: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
d1a0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
d1b0: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
d1c0: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
d1d0: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
d1e0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
d1f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d200: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
d210: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
d220: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
d230: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
d240: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
d250: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
d260: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
d270: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
d280: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d290: 74 65 33 56 64 62 65 46 72 61 6d 65 49 73 56 61  te3VdbeFrameIsVa
d2a0: 6c 69 64 28 70 29 20 29 3b 0a 20 20 66 6f 72 28  lid(p) );.  for(
d2b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64  i=0; i<p->nChild
d2c0: 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Csr; i++){.    s
d2d0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
d2e0: 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72  rsor(p->v, apCsr
d2f0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  [i]);.  }.  rele
d300: 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d  aseMemArray(aMem
d310: 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b  , p->nChildMem);
d320: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
d330: 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76  leteAuxData(p->v
d340: 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61  ->db, &p->pAuxDa
d350: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71  ta, -1, 0);.  sq
d360: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76  lite3DbFree(p->v
d370: 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66  ->db, p);.}..#if
d380: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d390: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47  _EXPLAIN./*.** G
d3a0: 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  ive a listing of
d3b0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20   the program in 
d3c0: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
d3d0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
d3e0: 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20  nterface is the 
d3f0: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56  same as sqlite3V
d400: 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20  dbeExec().  But 
d410: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75  instead of.** ru
d420: 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20  nning the code, 
d430: 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  it invokes the c
d440: 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72  allback once for
d450: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
d460: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75  n..** This featu
d470: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  re is used to im
d480: 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e  plement "EXPLAIN
d490: 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  "..**.** When p-
d4a0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63  >explain==1, eac
d4b0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
d4c0: 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a   listed.  When.*
d4d0: 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c  * p->explain==2,
d4e0: 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e   only OP_Explain
d4f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
d500: 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65  e listed and the
d510: 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20  se.** are shown 
d520: 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66  in a different f
d530: 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61  ormat.  p->expla
d540: 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f  in==2 is used to
d550: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58   implement.** EX
d560: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
d570: 2e 0a 2a 2a 20 32 30 31 38 2d 30 34 2d 32 34 3a  ..** 2018-04-24:
d580: 20 20 49 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d    In p->explain=
d590: 3d 32 20 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f  =2 mode, the OP_
d5a0: 49 6e 69 74 20 6f 70 63 6f 64 65 73 20 6f 66 20  Init opcodes of 
d5b0: 74 72 69 67 67 65 72 73 0a 2a 2a 20 61 72 65 20  triggers.** are 
d5c0: 61 6c 73 6f 20 73 68 6f 77 6e 2c 20 73 6f 20 74  also shown, so t
d5d0: 68 61 74 20 74 68 65 20 62 6f 75 6e 64 61 72 69  hat the boundari
d5e0: 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 6d  es between the m
d5f0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 0a  ain program and.
d600: 2a 2a 20 65 61 63 68 20 74 72 69 67 67 65 72 20  ** each trigger 
d610: 61 72 65 20 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a  are clear..**.**
d620: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
d630: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
d640: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
d650: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
d660: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
d670: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
d680: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
d690: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
d6a0: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
d6b0: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
d6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d6d0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
d6e0: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
d710: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
d720: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
d730: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
d760: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
d770: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
d780: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d7a0: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
d7b0: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
d7c0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d7e0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
d7f0: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
d800: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
d810: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d830: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
d840: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
d850: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
d880: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
d890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8b0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
d8c0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
d8d0: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
d8e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
d8f0: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
d900: 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 69 73 74 53   */.  int bListS
d910: 75 62 70 72 6f 67 73 20 3d 20 28 70 2d 3e 65 78  ubprogs = (p->ex
d920: 70 6c 61 69 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d  plain==1 || (db-
d930: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d940: 54 72 69 67 67 65 72 45 51 50 29 21 3d 30 29 3b  TriggerEQP)!=0);
d950: 0a 20 20 4f 70 20 2a 70 4f 70 20 3d 20 30 3b 0a  .  Op *pOp = 0;.
d960: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
d970: 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72  plain );.  asser
d980: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
d990: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20  E_MAGIC_RUN );. 
d9a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
d9b0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
d9c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
d9d0: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
d9e0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20  _NOMEM );..  /* 
d9f0: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73  Even though this
da00: 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74   opcode does not
da10: 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72   use dynamic str
da20: 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ings for.  ** th
da30: 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74  e result, result
da40: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63   columns may bec
da50: 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74  ome dynamic if t
da60: 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20  he user calls.  
da70: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
da80: 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73  n_text16(), caus
da90: 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f  ing a translatio
daa0: 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f  n to UTF-16 enco
dab0: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  ding..  */.  rel
dac0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65  easeMemArray(pMe
dad0: 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73  m, 8);.  p->pRes
dae0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69  ultSet = 0;..  i
daf0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
db00: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a  _NOMEM ){.    /*
db10: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
db20: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69   a malloc() insi
db30: 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  de a call to sql
db40: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
db50: 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  () or.    ** sql
db60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
db70: 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f  16() failed.  */
db80: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
db90: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65  ault(db);.    re
dba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
dbb0: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  R;.  }..  /* Whe
dbc0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
dbd0: 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63  output rows reac
dbe0: 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d  hes nRow, that m
dbf0: 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69  eans the.  ** li
dc00: 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68  sting has finish
dc10: 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73  ed and sqlite3_s
dc20: 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74  tep() should ret
dc30: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
dc40: 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68  .  ** nRow is th
dc50: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
dc60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
dc70: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c  he main program,
dc80: 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73   plus.  ** the s
dc90: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
dca0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20   of rows in all 
dcb0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
dcc0: 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a  ams encountered.
dcd0: 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68    ** so far.  Th
dce0: 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c  e nRow value wil
dcf0: 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65  l increase as ne
dd00: 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  w trigger subpro
dd10: 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65  grams are.  ** e
dd20: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20  ncountered, but 
dd30: 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74  p->pc will event
dd40: 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74  ually catch up t
dd50: 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e  o nRow..  */.  n
dd60: 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  Row = p->nOp;.  
dd70: 69 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67  if( bListSubprog
dd80: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  s ){.    /* The 
dd90: 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63  first 8 memory c
dda0: 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f  ells are used fo
ddb0: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
ddc0: 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20  .  So we will.  
ddd0: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20    ** commandeer 
dde0: 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20  the 9th cell to 
ddf0: 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66  use as storage f
de00: 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  or an array of p
de10: 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74  ointers.    ** t
de20: 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  o trigger subpro
de30: 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45  grams.  The VDBE
de40: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
de50: 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  o have at least 
de60: 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20  9.    ** cells. 
de70: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
de80: 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20  p->nMem>9 );.   
de90: 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d   pSub = &p->aMem
dea0: 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75  [9];.    if( pSu
deb0: 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  b->flags&MEM_Blo
dec0: 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  b ){.      /* On
ded0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
dee0: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
def0: 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c  ), pSub will hol
df00: 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73  d a NULL.  It is
df10: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  .      ** initia
df20: 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20  lized to a BLOB 
df30: 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f  by the P4_SUBPRO
df40: 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20  GRAM processing 
df50: 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20  logic below */. 
df60: 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62       nSub = pSub
df70: 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a  ->n/sizeof(Vdbe*
df80: 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d  );.      apSub =
df90: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
dfa0: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20  pSub->z;.    }. 
dfb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
dfc0: 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; i++){.      
dfd0: 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d  nRow += apSub[i]
dfe0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->nOp;.    }.  }
dff0: 0a 0a 20 20 77 68 69 6c 65 28 31 29 7b 20 20 2f  ..  while(1){  /
e000: 2a 20 4c 6f 6f 70 20 65 78 69 74 73 20 76 69 61  * Loop exits via
e010: 20 62 72 65 61 6b 20 2a 2f 0a 20 20 20 20 69 20   break */.    i 
e020: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 20 20 69  = p->pc++;.    i
e030: 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20  f( i>=nRow ){.  
e040: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
e050: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20  TE_OK;.      rc 
e060: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
e070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e080: 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  }.    if( i<p->n
e090: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
e0a0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
e0b0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
e0c0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
e0d0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
e0e0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
e0f0: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
e100: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
e110: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e120: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
e130: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
e140: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
e150: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
e160: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
e170: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
e180: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
e190: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
e1a0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
e1b0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
e1c0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
e1d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
e1e0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
e1f0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
e200: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
e210: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
e220: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e  ..    /* When an
e230: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
e240: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
e250: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
e260: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a   that has.    **
e270: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
e280: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
e290: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
e2a0: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
e2b0: 72 6f 67 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b  rograms.    ** k
e2c0: 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39  ept in p->aMem[9
e2d0: 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ].z to hold the 
e2e0: 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73  new program - as
e2f0: 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70  suming this subp
e300: 72 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61  rogram.    ** ha
e310: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
e320: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a  en seen..    */.
e330: 20 20 20 20 69 66 28 20 62 4c 69 73 74 53 75 62      if( bListSub
e340: 70 72 6f 67 73 20 26 26 20 70 4f 70 2d 3e 70 34  progs && pOp->p4
e350: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
e360: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  RAM ){.      int
e370: 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31   nByte = (nSub+1
e380: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
e390: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
e3a0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
e3b0: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
e3c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53  .        if( apS
e3d0: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
e3e0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
e3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e400: 66 28 20 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20  f( j==nSub ){.  
e410: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
e420: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
e430: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
e440: 75 62 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ub!=0);.        
e450: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
e460: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e470: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
e480: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ROR;.          b
e490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
e4a0: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
e4b0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
e4c0: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
e4d0: 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20  apSub[nSub++] = 
e4e0: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
e4f0: 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
e500: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
e510: 62 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  b;.        pSub-
e520: 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66  >n = nSub*sizeof
e530: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
e540: 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70         nRow += p
e550: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d  Op->p4.pProgram-
e560: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
e570: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
e580: 78 70 6c 61 69 6e 3c 32 20 29 20 62 72 65 61 6b  xplain<2 ) break
e590: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
e5a0: 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
e5b0: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
e5c0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
e5d0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 2d 3e 70 63  OP_Init && p->pc
e5e0: 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  >1 ) break;.  }.
e5f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
e600: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
e610: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
e620: 70 74 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  pted ){.      p-
e630: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
e640: 45 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 63  ERRUPT;.      rc
e650: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e670: 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74  beError(p, sqlit
e680: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
e690: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e6a0: 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20     char *zP4;.  
e6b0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
e6c0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  in==1 ){.       
e6d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e6e0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20  EM_Int;.        
e6f0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e720: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
e730: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   */.        pMem
e740: 2b 2b 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20  ++;.    .       
e750: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e760: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
e770: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
e780: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
e790: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
e7a0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
e7b0: 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  de); /* Opcode *
e7c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
e7d0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
e7e0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
e7f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e800: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
e810: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
e820: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
e830: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
e840: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d     }..      pMem
e850: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e860: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
e870: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
e8a0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
e8b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e8c0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e8d0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
e8e0: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70  /* P2 */.      p
e910: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d  Mem++;..      pM
e920: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e930: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
e940: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
e970: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
e980: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
e990: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
e9a0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30  dResize(pMem, 10
e9b0: 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20  0) ){ /* P4 */. 
e9c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e9d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e9e0: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
e9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ea00: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
ea10: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ea20: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
ea30: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 64 69 73  .      zP4 = dis
ea40: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
ea50: 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  ->z, pMem->szMal
ea60: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  loc);.      if( 
ea70: 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  zP4!=pMem->z ){.
ea80: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
ea90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
eaa0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
eab0: 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c  r(pMem, zP4, -1,
eac0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
ead0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
eae0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eaf0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
eb00: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
eb10: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
eb20: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
eb30: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
eb40: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
eb50: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  }.      pMem++;.
eb60: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78  .      if( p->ex
eb70: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
eb80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
eb90: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
eba0: 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b  size(pMem, 4) ){
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ebc0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
ebd0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
ebe0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ebf0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
ec00: 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   }.        pMem-
ec10: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
ec20: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
ec30: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
ec40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ec50: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
ec60: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
ec70: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
ec80: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /.        pMem->
ec90: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
eca0: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b  8;.        pMem+
ecb0: 2b 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  +;.    .#ifdef S
ecc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
ecd0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
ece0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ecf0: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
ed00: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30  Resize(pMem, 500
ed10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
ed20: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
ed30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
ed40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
ed50: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
ed60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
ed70: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ed80: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
ed90: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
eda0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
edb0: 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e  pOp, zP4, pMem->
edc0: 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 20  z, 500);.       
edd0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
ede0: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a  ITE_UTF8;.#else.
edf0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
ee00: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20  ags = MEM_Null; 
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
ee30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
ee40: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65   }..      p->nRe
ee50: 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a  sColumn = 8 - 4*
ee60: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
ee70: 20 20 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74        p->pResult
ee80: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
ee90: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ];.      p->rc =
eea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
eeb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
eec0: 57 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  W;.    }.  }.  r
eed0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
eee0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
eef0: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
ef00: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
ef10: 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  G./*.** Print th
ef20: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
ef30: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
ef40: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
ef50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
ef60: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
ef70: 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *p){.  const ch
ef80: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28  ar *z = 0;.  if(
ef90: 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
efa0: 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d  z = p->zSql;.  }
efb0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  else if( p->nOp>
efc0: 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =1 ){.    const 
efd0: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70  VdbeOp *pOp = &p
efe0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66  ->aOp[0];.    if
eff0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
f000: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
f010: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  4.z!=0 ){.      
f020: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
f030: 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
f040: 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29  te3Isspace(*z) )
f050: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   z++;.    }.  }.
f060: 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66    if( z ) printf
f070: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
f080: 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  z);.}.#endif..#i
f090: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
f0a0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
f0b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
f0c0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a  ENABLE_IOTRACE).
f0d0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49  /*.** Print an I
f0e0: 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73  OTRACE message s
f0f0: 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65  howing SQL conte
f100: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
f110: 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71  te3VdbeIOTraceSq
f120: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
f130: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
f140: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
f150: 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72   if( sqlite3IoTr
f160: 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ace==0 ) return;
f170: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
f180: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
f190: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
f1a0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
f1b0: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
f1c0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
f1d0: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
f1e0: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
f1f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
f200: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
f210: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
f220: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
f230: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
f240: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
f250: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
f260: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f270: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
f280: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
f290: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
f2a0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
f2b0: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
f2c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f2d0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
f2e0: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
f2f0: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
f300: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
f310: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
f320: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
f330: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
f340: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
f350: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
f360: 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /../* An instanc
f370: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
f380: 20 64 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20   describes bulk 
f390: 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  memory available
f3a0: 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73   for use.** by s
f3b0: 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20  ubcomponents of 
f3c0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
f3d0: 6d 65 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20  ment.  Space is 
f3e0: 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a  allocated out.**
f3f0: 20 6f 66 20 61 20 52 65 75 73 61 62 6c 65 53 70   of a ReusableSp
f400: 61 63 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68  ace object by th
f410: 65 20 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72  e allocSpace() r
f420: 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f  outine below..*/
f430: 0a 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65  .struct Reusable
f440: 53 70 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53  Space {.  u8 *pS
f450: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f  pace;          /
f460: 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  * Available memo
f470: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  ry */.  int nFre
f480: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
f490: 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  Bytes of availab
f4a0: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  le memory */.  i
f4b0: 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20  nt nNeeded;     
f4c0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74      /* Total byt
f4d0: 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f  es that could no
f4e0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  t be allocated *
f4f0: 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20  /.};../* Try to 
f500: 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  allocate nByte b
f510: 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61  ytes of 8-byte a
f520: 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f  ligned bulk memo
f530: 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66  ry for pBuf.** f
f540: 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65  rom the Reusable
f550: 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52  Space object.  R
f560: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
f570: 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
f580: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75  .** memory on su
f590: 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66  ccess.  If insuf
f5a0: 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69  ficient memory i
f5b0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  s available in t
f5c0: 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70  he.** ReusableSp
f5d0: 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72  ace object, incr
f5e0: 65 61 73 65 20 74 68 65 20 52 65 75 73 61 62 6c  ease the Reusabl
f5f0: 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a  eSpace.nNeeded.*
f600: 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65 20 61  * value by the a
f610: 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64  mount needed and
f620: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
f630: 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e  .** If pBuf is n
f640: 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ot initially NUL
f650: 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  L, that means th
f660: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61  at the memory ha
f670: 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
f680: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61  n allocated by a
f690: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74   prior call to t
f6a0: 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20  his routine, so 
f6b0: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
f6c0: 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e  py.** of pBuf an
f6d0: 64 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65  d leave Reusable
f6e0: 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e  Space unchanged.
f6f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f  .**.** This allo
f700: 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65  cator is employe
f710: 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75  d to repurpose u
f720: 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74  nused slots at t
f730: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
f740: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66   opcode array of
f750: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 20   prepared state 
f760: 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79  for other memory
f770: 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70 72   needs of the pr
f780: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
f790: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
f7a0: 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28  oid *allocSpace(
f7b0: 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62  .  struct Reusab
f7c0: 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20  leSpace *p,  /* 
f7d0: 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  Bulk memory avai
f7e0: 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  lable for alloca
f7f0: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
f800: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
f810: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f820: 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61  o a prior alloca
f830: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  tion */.  int nB
f840: 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
f850: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
f860: 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f  memory needed */
f870: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49  .){.  assert( EI
f880: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
f890: 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b  NT(p->pSpace) );
f8a0: 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  .  if( pBuf==0 )
f8b0: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f  {.    nByte = RO
f8c0: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20  UND8(nByte);.   
f8d0: 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d   if( nByte <= p-
f8e0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  >nFree ){.      
f8f0: 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  p->nFree -= nByt
f900: 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  e;.      pBuf = 
f910: 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46  &p->pSpace[p->nF
f920: 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ree];.    }else{
f930: 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65  .      p->nNeede
f940: 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  d += nByte;.    
f950: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
f960: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
f970: 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20  MENT(pBuf) );.  
f980: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
f990: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
f9a0: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
f9b0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
f9c0: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
f9d0: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
f9e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
f9f0: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
fa00: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
fa10: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
fa20: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
fa30: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
fa40: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
fa50: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fa60: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
fa70: 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d  MAGIC_INIT || p-
fa80: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
fa90: 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f  IC_RESET );..  /
faa0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
fab0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
fac0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
fad0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
fae0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
faf0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
fb00: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
fb10: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
fb20: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
fb30: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
fb40: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
fb50: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  _DEBUG.  for(i=0
fb60: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
fb70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
fb80: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
fb90: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
fba0: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
fbb0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
fbc0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
fbd0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
fbe0: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
fbf0: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
fc00: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
fc10: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
fc20: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
fc30: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
fc40: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
fc50: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
fc60: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
fc70: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
fc80: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
fc90: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
fca0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
fcb0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
fcc0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
fcd0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fce0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
fcf0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
fd00: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
fd10: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
fd20: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
fd30: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
fd40: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
fd50: 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61  ting registers a
fd60: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
fd70: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
fd80: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
fd90: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
fda0: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
fdb0: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
fdc0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
fdd0: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
fde0: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
fdf0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
fe00: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
fe10: 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68  tly once on each
fe20: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fe30: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
fe40: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
fe50: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
fe60: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
fe70: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
fe80: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
fe90: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
fea0: 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c  ed, further call
feb0: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
fec0: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
fed0: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
fee0: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
fef0: 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
ff00: 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
ff10: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
ff20: 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
ff30: 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
ff40: 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
ff50: 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
ff60: 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
ff70: 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
ff80: 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
ff90: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
ffa0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
ffb0: 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
ffc0: 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
ffd0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
ffe0: 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
fff0: 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
10000 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
10010 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
10020 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
10030 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
10060 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
10070 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
10080 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10090 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
100a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
100d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
100e0 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
10110 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
10120 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
10130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10140 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
10150 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
10160 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
10190 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
101a0 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
101d0 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
101e0 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
101f0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
10200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10210 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10220 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65   struct Reusable
10230 53 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20  Space x;        
10240 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b  /* Reusable bulk
10250 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73   memory */..  as
10260 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
10270 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
10280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10290 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
102a0 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
102b0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
102c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
102d0 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b  se==p->pParse );
102e0 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
102f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
10300 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
10310 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
10320 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
10330 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10340 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
10350 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
10360 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
10370 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63  ;.  .  /* Each c
10380 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d  ursor uses a mem
10390 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66  ory cell.  The f
103a0 69 72 73 74 20 63 75 72 73 6f 72 20 28 63 75 72  irst cursor (cur
103b0 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20  sor 0) can.  ** 
103c0 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63  use aMem[0] whic
103d0 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69  h is not otherwi
103e0 73 65 20 75 73 65 64 20 62 79 20 74 68 65 20 56  se used by the V
103f0 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c  DBE program.  Al
10400 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63  locate.  ** spac
10410 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
10420 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f  aMem[] for curso
10430 72 73 20 31 20 61 6e 64 20 67 72 65 61 74 65 72  rs 1 and greater
10440 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  ..  ** See also:
10450 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
10460 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
10470 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  = nCursor;.  if(
10480 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e   nCursor==0 && n
10490 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20  Mem>0 ) nMem++; 
104a0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d   /* Space for aM
104b0 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f  em[0] even if no
104c0 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  t used */..  /* 
104d0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
104e0 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d  uch reusable mem
104f0 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ory is available
10500 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10510 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61  he.  ** opcode a
10520 72 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72  rray.  This extr
10530 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  a memory will be
10540 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72   reallocated for
10550 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a   other elements.
10560 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70    ** of the prep
10570 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
10580 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44    */.  n = ROUND
10590 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e  8(sizeof(Op)*p->
105a0 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  nOp);           
105b0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f     /* Bytes of o
105c0 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65  pcode memory use
105d0 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20  d */.  x.pSpace 
105e0 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29  = &((u8*)p->aOp)
105f0 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [n];            
10600 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63     /* Unused opc
10610 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ode memory */.  
10620 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
10630 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70  TE_ALIGNMENT(x.p
10640 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46  Space) );.  x.nF
10650 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38  ree = ROUNDDOWN8
10660 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c  (pParse->szOpAll
10670 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74  oc - n);  /* Byt
10680 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d  es of unused mem
10690 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
106a0 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20   x.nFree>=0 );. 
106b0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
106c0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78  YTE_ALIGNMENT(&x
106d0 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d  .pSpace[x.nFree]
106e0 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ) );..  resolveP
106f0 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
10700 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
10710 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
10720 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
10730 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
10740 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
10750 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10760 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
10770 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
10780 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
10790 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
107a0 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
107b0 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
107c0 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
107d0 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74  ated in one or t
107e0 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20  wo.  ** passes. 
107f0 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   On the first pa
10800 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65  ss, we try to re
10810 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72  use unused memor
10820 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  y at the .  ** e
10830 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
10840 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
10850 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
10860 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
10870 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
10880 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
10890 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
108a0 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
108b0 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
108c0 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
108d0 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61  emainder using a
108e0 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c   fresh memory al
108f0 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
10900 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
10910 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
10920 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
10930 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
10940 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
10950 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72  e leftover memor
10960 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
10970 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
10980 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e  .  This can sign
10990 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
109a0 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
109b0 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
109c0 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
109d0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
109e0 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  x.nNeeded = 0;. 
109f0 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
10a00 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 4d 65  Space(&x, 0, nMe
10a10 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
10a20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
10a30 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 56  cSpace(&x, 0, nV
10a40 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  ar*sizeof(Mem));
10a50 0a 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c  .  p->apArg = al
10a60 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
10a70 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
10a80 29 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d  ));.  p->apCsr =
10a90 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10aa0 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
10ab0 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10ac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10ad0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10ae0 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65  TATUS.  p->anExe
10af0 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  c = allocSpace(&
10b00 78 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  x, 0, p->nOp*siz
10b10 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69  eof(i64));.#endi
10b20 66 0a 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65  f.  if( x.nNeede
10b30 64 20 29 7b 0a 20 20 20 20 78 2e 70 53 70 61 63  d ){.    x.pSpac
10b40 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73  e = p->pFree = s
10b50 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
10b60 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65  wNN(db, x.nNeede
10b70 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20  d);.    x.nFree 
10b80 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 20  = x.nNeeded;.   
10b90 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
10ba0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
10bb0 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
10bc0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d  pace(&x, p->aMem
10bd0 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
10be0 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56  m));.      p->aV
10bf0 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
10c00 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61  &x, p->aVar, nVa
10c10 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  r*sizeof(Mem));.
10c20 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
10c30 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10c40 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
10c50 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20  izeof(Mem*));.  
10c60 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61      p->apCsr = a
10c70 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
10c80 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
10c90 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
10ca0 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  r*));.#ifdef SQL
10cb0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
10cc0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
10cd0 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
10ce0 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
10cf0 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69  nExec, p->nOp*si
10d00 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
10d10 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
10d20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72  p->pVList = pPar
10d30 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50  se->pVList;.  pP
10d40 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20  arse->pVList =  
10d50 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
10d60 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
10d70 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  n;.  if( db->mal
10d80 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
10d90 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20   p->nVar = 0;.  
10da0 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30    p->nCursor = 0
10db0 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
10dc0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
10dd0 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
10de0 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61  rsor;.    p->nVa
10df0 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
10e00 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
10e10 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c  y(p->aVar, nVar,
10e20 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   db, MEM_Null);.
10e30 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
10e40 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  em;.    initMemA
10e50 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  rray(p->aMem, nM
10e60 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65  em, db, MEM_Unde
10e70 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73  fined);.    mems
10e80 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20  et(p->apCsr, 0, 
10e90 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
10ea0 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
10eb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10ec0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
10ed0 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  US.    memset(p-
10ee0 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e  >anExec, 0, p->n
10ef0 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
10f00 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
10f10 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
10f20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
10f30 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
10f40 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
10f50 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
10f60 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
10f70 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
10f80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
10f90 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
10fa0 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
10fb0 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
10fc0 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
10fd0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
10fe0 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20  t( pCx->pBtx==0 
10ff0 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  || pCx->eCurType
11000 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
11010 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43 78  );.  switch( pCx
11020 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20  ->eCurType ){.  
11030 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 53    case CURTYPE_S
11040 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ORTER: {.      s
11050 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
11060 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
11070 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11080 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43      }.    case C
11090 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a  URTYPE_BTREE: {.
110a0 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 69        if( pCx->i
110b0 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
110c0 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70        if( pCx->p
110d0 42 74 78 20 29 20 73 71 6c 69 74 65 33 42 74 72  Btx ) sqlite3Btr
110e0 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
110f0 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  x);.        /* T
11100 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
11110 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
11120 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
11130 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
11140 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
11150 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  l above. */.    
11160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11170 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63   assert( pCx->uc
11180 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
11190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
111a0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
111b0 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  Cx->uc.pCursor);
111c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
111d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
111e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
111f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
11200 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 56 54   case CURTYPE_VT
11210 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
11220 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
11230 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63  *pVCur = pCx->uc
11240 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f  .pVCur;.      co
11250 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
11260 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56  le *pModule = pV
11270 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64  Cur->pVtab->pMod
11280 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ule;.      asser
11290 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d  t( pVCur->pVtab-
112a0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
112b0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
112c0 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f  Ref--;.      pMo
112d0 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43  dule->xClose(pVC
112e0 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ur);.      break
112f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11300 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
11310 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e  e all cursors in
11320 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
11330 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
11340 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  id closeCursorsI
11350 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b  nFrame(Vdbe *p){
11360 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
11370 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
11380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
11390 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
113a0 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20       VdbeCursor 
113b0 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
113c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20  ];.      if( pC 
113d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
113e0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
113f0 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20  (p, pC);.       
11400 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
11410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11420 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70    }.}../*.** Cop
11430 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
11440 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
11450 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
11460 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
11470 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
11480 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
11490 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
114a0 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
114b0 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
114c0 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
114d0 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
114e0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
114f0 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
11500 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
11510 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
11520 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f  >v;.  closeCurso
11530 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69  rsInFrame(v);.#i
11540 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11550 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
11560 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d  US.  v->anExec =
11570 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b   pFrame->anExec;
11580 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70  .#endif.  v->aOp
11590 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
115a0 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
115b0 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
115c0 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
115d0 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
115e0 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
115f0 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
11600 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
11610 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
11620 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
11630 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
11640 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
11650 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
11660 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
11670 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65    v->db->nChange
11680 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68   = pFrame->nDbCh
11690 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56  ange;.  sqlite3V
116a0 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
116b0 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78  (v->db, &v->pAux
116c0 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
116d0 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46  v->pAuxData = pF
116e0 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a  rame->pAuxData;.
116f0 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61    pFrame->pAuxDa
11700 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ta = 0;.  return
11710 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
11720 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
11730 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
11740 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
11750 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
11760 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
11770 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
11780 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
11790 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
117a0 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
117b0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
117c0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
117d0 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
117e0 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
117f0 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
11800 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
11810 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
11820 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
11830 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
11840 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
11850 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
11860 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
11870 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
11880 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
11890 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
118a0 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
118b0 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
118c0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
118d0 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
118e0 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20  ;.    p->pFrame 
118f0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61  = 0;.    p->nFra
11900 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  me = 0;.  }.  as
11910 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d  sert( p->nFrame=
11920 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72  =0 );.  closeCur
11930 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a  sorsInFrame(p);.
11940 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
11950 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
11960 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d  rray(p->aMem, p-
11970 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
11980 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
11990 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
119a0 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
119b0 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
119c0 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
119d0 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
119e0 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
119f0 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
11a00 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
11a10 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
11a20 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
11a30 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e VM */.  if( p-
11a40 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c 69  >pAuxData ) sqli
11a50 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
11a60 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e  Data(p->db, &p->
11a70 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
11a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
11a90 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
11aa0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
11ab0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
11ac0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
11ad0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
11ae0 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
11af0 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
11b00 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
11b10 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
11b20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
11b30 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
11b40 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
11b50 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
11b60 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
11b70 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
11b80 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
11b90 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
11ba0 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
11bb0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
11bc0 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
11bd0 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
11be0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
11bf0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11c00 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f  .  if( p->nResCo
11c10 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65  lumn ){.    rele
11c20 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
11c30 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
11c40 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
11c50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
11c60 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
11c70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d  Name);.  }.  n =
11c80 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
11c90 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
11ca0 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
11cb0 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
11cc0 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
11cd0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
11ce0 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
11cf0 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
11d00 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
11d10 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d   return;.  initM
11d20 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
11d30 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f  ame, n, db, MEM_
11d40 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Null);.}../*.** 
11d50 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
11d60 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
11d70 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
11d80 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
11d90 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
11da0 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
11db0 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
11dc0 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
11dd0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
11de0 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
11df0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
11e00 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
11e10 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
11e20 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
11e30 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
11e40 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
11e50 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
11e60 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
11e70 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
11e80 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
11e90 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
11ea0 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
11eb0 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
11ec0 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
11ed0 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
11ee0 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
11ef0 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
11f00 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
11f10 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
11f40 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
11f50 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11f80 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
11f90 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
11fa0 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
11fd0 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
11fe0 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
11ff0 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
12000 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12010 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
12020 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
12030 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
12040 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
12050 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
12060 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
12070 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
12080 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
12090 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
120a0 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
120b0 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
120c0 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
120d0 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
120e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
120f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12100 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
12110 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
12120 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12130 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
12140 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
12150 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
12160 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
12170 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76  ->aColName[idx+v
12180 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  ar*p->nResColumn
12190 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
121a0 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
121b0 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
121c0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
121d0 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72  , xDel);.  asser
121e0 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61  t( rc!=0 || !zNa
121f0 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d  me || (pColName-
12200 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29  >flags&MEM_Term)
12210 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
12220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
12230 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
12240 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
12250 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
12260 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
12270 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
12280 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12290 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
122a0 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
122b0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
122c0 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
122d0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
122e0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
122f0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
12300 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
12310 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
12320 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
12330 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
12340 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
12350 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
12360 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30    int nTrans = 0
12370 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
12380 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61  databases with a
12390 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74  n active write-t
123a0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
123c0 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69 64   that are candid
123d0 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70  ates for a two-p
123e0 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e  hase commit usin
123f0 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  g a.            
12400 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72         ** master
12410 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  -journal */.  in
12420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12430 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
12440 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
12450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
12460 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
12470 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
12480 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
12490 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
124a0 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
124b0 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
124c0 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
124d0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
124e0 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
124f0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
12500 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
12510 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
12520 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
12530 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
12540 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
12550 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
12560 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
12570 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
12580 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
12590 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
125a0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
125b0 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
125c0 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
125d0 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
125e0 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
125f0 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
12600 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
12610 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
12620 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
12630 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a  nc(db, p);..  /*
12640 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
12650 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
12660 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
12670 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
12680 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
12690 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
126a0 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
126b0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
126c0 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
126d0 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
126e0 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
126f0 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
12700 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
12710 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
12720 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
12730 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
12740 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
12750 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
12760 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
12770 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
12780 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
12790 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
127a0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
127b0 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
127c0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
127d0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
127e0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
127f0 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
12800 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f      /* Whether o
12810 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  r not a database
12820 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61   might need a ma
12830 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70  ster journal dep
12840 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20  ends upon.      
12850 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d  ** its journal m
12860 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72  ode (among other
12870 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20   things).  This 
12880 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65  matrix determine
12890 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  s which.      **
128a0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75   journal modes u
128b0 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  se a master jour
128c0 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f  nal and which do
128d0 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74   not */.      st
128e0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d  atic const u8 aM
128f0 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20  JNeeded[] = {.  
12900 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20        /* DELETE 
12910 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20    */  1,.       
12920 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f   /* PERSIST   */
12930 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   1,.        /* O
12940 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  FF       */ 0,. 
12950 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41         /* TRUNCA
12960 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20  TE  */ 1,.      
12970 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a    /* MEMORY    *
12980 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 0,.        /* 
12990 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20  WAL       */ 0. 
129a0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61       };.      Pa
129b0 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f  ger *pPager;   /
129c0 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74  * Pager associat
129d0 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20  ed with pBt */. 
129e0 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
129f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
12a00 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
12a10 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  t);.      pPager
12a20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
12a30 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
12a40 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
12a50 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41  safety_level!=PA
12a60 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
12a70 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d  OFF.       && aM
12a80 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50  JNeeded[sqlite3P
12a90 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerGetJournalMo
12aa0 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20  de(pPager)].    
12ab0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
12ac0 65 72 49 73 4d 65 6d 64 62 28 70 50 61 67 65 72  erIsMemdb(pPager
12ad0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 20 0a 20  )==0.      ){ . 
12ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
12af0 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  !=1 );.        n
12b00 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d  Trans++;.      }
12b10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12b20 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
12b30 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
12b40 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12b50 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
12b60 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
12b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12b90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
12ba0 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
12bb0 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
12bc0 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
12bd0 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
12be0 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
12bf0 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
12c00 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
12c10 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
12c20 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
12c30 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
12c40 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
12c50 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
12c60 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a  INT_COMMITHOOK;.
12c70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12c80 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
12c90 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
12ca0 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
12cb0 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
12cc0 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
12cd0 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
12ce0 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
12cf0 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
12d00 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
12d10 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
12d20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
12d30 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
12d40 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
12d50 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
12d60 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
12d70 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
12d80 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
12d90 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
12da0 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
12db0 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
12dc0 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
12dd0 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
12de0 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
12df0 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
12e00 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
12e10 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
12e20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
12e30 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
12e40 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
12e50 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
12e60 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
12e70 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
12e80 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
12e90 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
12ea0 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
12eb0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
12ec0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
12ed0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
12ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12ef0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
12f00 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
12f10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
12f20 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
12f30 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
12f40 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
12f50 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
12f60 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
12f70 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
12f80 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
12f90 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
12fa0 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
12fb0 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
12fc0 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
12fd0 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
12fe0 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
12ff0 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
13000 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
13010 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
13020 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
13030 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
13040 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
13050 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
13060 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
13070 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
13080 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
13090 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
130a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
130b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
130c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
130d0 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
130e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
130f0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13110 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
13120 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
13130 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
13140 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
13150 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
13160 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13170 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
13180 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
13190 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
131a0 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
131b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
131c0 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
131d0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f  atomically..  */
131e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
131f0 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
13200 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
13210 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
13220 70 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a  pVfs;.    char *
13230 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
13240 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
13250 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13260 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
13270 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
13280 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
13290 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
132a0 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
132b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
132c0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
132d0 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
132e0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
132f0 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20  nt retryCount = 
13300 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e  0;.    int nMain
13310 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  File;..    /* Se
13320 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
13330 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
13340 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65  */.    nMainFile
13350 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
13360 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  30(zMainFile);. 
13370 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
13380 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
13390 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a  "%s-mjXXXXXX9XXz
133a0 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  ", zMainFile);. 
133b0 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d     if( zMaster==
133c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
133d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
133e0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
133f0 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
13400 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29  if( retryCount )
13410 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
13420 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a  tryCount>100 ){.
13430 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13440 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
13450 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25  L, "MJ delete: %
13460 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
13470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
13480 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
13490 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
134a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
134b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
134c0 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20  tryCount==1 ){. 
134d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
134e0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
134f0 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25  , "MJ collide: %
13500 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
13510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13520 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74        retryCount
13530 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
13540 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
13550 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
13560 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73  Random);.      s
13570 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
13580 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61  13, &zMaster[nMa
13590 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36  inFile], "-mj%06
135a0 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20  X9%02X",.       
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135c0 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d          (iRandom
135d0 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69  >>8)&0xffffff, i
135e0 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20  Random&0xff);.  
135f0 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70      /* The antip
13600 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61  enultimate chara
13610 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74  cter of the mast
13620 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
13630 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
13640 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61   "9" to avoid na
13650 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68  me collisions wh
13660 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c  en using 8+3 fil
13670 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20  enames. */.     
13680 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72   assert( zMaster
13690 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
136a0 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39  (zMaster)-3]=='9
136b0 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ' );.      sqlit
136c0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d  e3FileSuffix3(zM
136d0 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72  ainFile, zMaster
136e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
136f0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
13700 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
13710 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
13720 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
13730 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
13740 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
13750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
13770 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
13780 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
13790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
137a0 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
137b0 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
137c0 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
137d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
137e0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
137f0 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
13800 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
13810 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
13820 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
13830 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
13840 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
13850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13860 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
13870 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
13880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13890 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
138a0 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
138b0 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
138c0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
138d0 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
138e0 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
138f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13900 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
13910 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
13920 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
13930 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
13940 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13950 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
13960 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
13970 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
13980 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
13990 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
139a0 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
139b0 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
139c0 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
139d0 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
139e0 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
139f0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
13a00 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
13a10 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
13a20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
13a30 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
13a40 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
13a50 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
13a60 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
13a70 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
13a80 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
13a90 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
13aa0 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
13ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
13ac0 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
13ad0 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
13ae0 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
13af0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13b00 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
13b10 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
13b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13b30 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
13b40 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
13b50 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
13b60 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
13b70 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
13b80 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
13b90 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
13ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
13bc0 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
13bd0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
13be0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
13bf0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
13c00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13c10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13c20 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13c40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13c50 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
13c60 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
13c70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
13c80 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
13c90 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
13ca0 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
13cb0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
13cc0 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
13cd0 20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69 74 65    if( 0==(sqlite
13ce0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
13cf0 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
13d00 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
13d10 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
13d20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
13d30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
13d40 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
13d50 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
13d60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
13d70 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
13d80 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
13d90 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13da0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
13db0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13dc0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
13dd0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
13de0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
13df0 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
13e00 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
13e10 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
13e20 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
13e30 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
13e40 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13e50 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
13e60 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
13e70 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
13e80 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
13e90 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
13ea0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
13eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
13ec0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
13ed0 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
13ee0 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
13ef0 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
13f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
13f10 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
13f20 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
13f30 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
13f40 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
13f50 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
13f60 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
13f70 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
13f80 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
13f90 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
13fa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
13fb0 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
13fc0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
13fd0 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
13fe0 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
13ff0 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
14000 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
14010 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
14020 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
14030 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
14040 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
14050 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
14060 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14070 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
14080 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
14090 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
140a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
140b0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
140c0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
140d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  rt( rc!=SQLITE_B
140e0 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  USY );.    if( r
140f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14100 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
14110 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
14120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
14130 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
14140 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
14150 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
14160 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
14170 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
14180 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
14190 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
141a0 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
141b0 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
141c0 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
141d0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
141e0 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
141f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
14200 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
14210 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
14220 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
14230 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
14240 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
14250 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
14260 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14270 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
14280 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
14290 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
142a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
142b0 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
142c0 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
142d0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
142e0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
142f0 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
14300 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
14310 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
14320 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
14330 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
14340 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
14350 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
14360 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
14370 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
14380 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
14390 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
143a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
143b0 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
143c0 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
143d0 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
143e0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
143f0 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
14400 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
14410 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
14420 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
14430 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
14440 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
14450 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
14460 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
14470 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
14480 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
14490 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
144a0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
144b0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
144c0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
144d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
144e0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
144f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14500 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
14510 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14520 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
14530 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
14540 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
14550 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
14560 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
14570 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
14580 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
14590 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
145a0 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65  ite3.nVdbeActive
145b0 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
145c0 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
145d0 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
145e0 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
145f0 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
14600 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
14610 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
14620 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
14630 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
14640 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
14650 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
14660 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
14670 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
14680 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
14690 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
146a0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
146b0 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
146c0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
146d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
146e0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
146f0 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
14700 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
14710 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
14720 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
14730 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61   = 0;.  int nRea
14740 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  d = 0;.  p = db-
14750 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
14760 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71   p ){.    if( sq
14770 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
14780 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
14790 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ) ){.      cnt++
147a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
147b0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
147c0 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ite++;.      if(
147d0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
147e0 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nRead++;.    }. 
147f0 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
14800 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
14810 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74  nt==db->nVdbeAct
14820 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ive );.  assert(
14830 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64   nWrite==db->nVd
14840 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73  beWrite );.  ass
14850 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e  ert( nRead==db->
14860 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23  nVdbeRead );.}.#
14870 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
14880 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
14890 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
148a0 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
148b0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
148c0 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
148d0 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
148e0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
148f0 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
14900 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
14910 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
14920 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
14930 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14940 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
14950 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
14960 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
14970 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
14980 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
14990 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
149a0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
149b0 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
149c0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
149d0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
149e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
149f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
14a00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
14a10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
14a20 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
14a30 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
14a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
14a50 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
14a60 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  vdbeCloseStateme
14a70 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
14a80 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
14a90 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
14aa0 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
14ab0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
14ac0 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53  ;.  const int iS
14ad0 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
14ae0 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61  tatement-1;..  a
14af0 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45  ssert( eOp==SAVE
14b00 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
14b10 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  | eOp==SAVEPOINT
14b20 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 61 73 73  _RELEASE);.  ass
14b30 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
14b40 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
14b50 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
14b60 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
14b70 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
14b80 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ) );..  for(i=0;
14b90 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
14ba0 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  { .    int rc2 =
14bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14bc0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
14bd0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
14be0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
14bf0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
14c00 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
14c10 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73  .        rc2 = s
14c20 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
14c30 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
14c40 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
14c50 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
14c60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 32   }.      if( rc2
14c70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14c80 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
14c90 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
14ca0 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
14cb0 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
14cc0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
14cd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14ce0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14cf0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
14d00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
14d10 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
14d20 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  -;.  p->iStateme
14d30 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72  nt = 0;..  if( r
14d40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14d50 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
14d60 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14d70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
14d80 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
14d90 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
14da0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
14db0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
14dc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14dd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14de0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
14df0 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
14e00 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
14e10 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
14e20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14e30 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
14e40 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
14e50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
14e60 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
14e70 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
14e80 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
14e90 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
14ea0 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
14eb0 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a  t had when .  **
14ec0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
14ed0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
14ee0 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28  pened.  */.  if(
14ef0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
14f00 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
14f10 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
14f20 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43  s = p->nStmtDefC
14f30 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  ons;.    db->nDe
14f40 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
14f50 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f  p->nStmtDefImmCo
14f60 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ns;.  }.  return
14f70 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
14f80 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14f90 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
14fa0 74 20 65 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d  t eOp){.  if( p-
14fb0 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20  >db->nStatement 
14fc0 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
14fd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 76   ){.    return v
14fe0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
14ff0 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20  t(p, eOp);.  }. 
15000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15010 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
15020 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15030 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
15040 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
15050 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
15060 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
15070 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
15080 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
15090 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
150a0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
150b0 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
150c0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
150d0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
150e0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
150f0 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
15100 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15110 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
15120 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
15130 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
15140 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
15150 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
15160 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
15170 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
15180 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
15190 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
151a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
151b0 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
151c0 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
151d0 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
151e0 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
151f0 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
15200 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15210 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
15220 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
15230 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
15240 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
15250 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
15260 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
15270 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
15280 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
15290 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
152a0 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
152b0 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
152c0 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
152d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
152e0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
152f0 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
15300 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
15310 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
15320 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
15330 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   "FOREIGN KEY co
15340 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
15350 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15360 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
15370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15380 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
15390 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
153a0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
153b0 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
153c0 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
153d0 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
153e0 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
153f0 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
15400 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
15410 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
15420 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
15430 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
15440 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
15450 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
15460 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
15470 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
15480 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
15490 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
154a0 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
154b0 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
154c0 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
154d0 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
154e0 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
154f0 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
15500 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
15510 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
15520 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
15530 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
15540 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
15550 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
15560 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
15570 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
15580 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
15590 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
155a0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
155b0 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
155c0 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
155d0 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
155e0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
155f0 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
15600 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
15630 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
15640 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
15650 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
15660 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
15670 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
15680 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
15690 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
156a0 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
156b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
156c0 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
156d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
156e0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
156f0 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
15700 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
15710 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
15720 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
15730 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
15740 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
15750 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
15760 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
15770 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
15780 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
15790 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
157a0 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
157b0 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
157c0 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
157d0 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
157e0 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
157f0 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
15800 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
15810 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
15820 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
15830 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
15840 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
15850 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
15860 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
15870 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
15880 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
15890 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
158a0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
158b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
158c0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  _OK;.  }.  if( d
158d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
158e0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
158f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
15900 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
15910 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 63 68  Cursors(p);.  ch
15920 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
15930 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
15940 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
15950 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
15960 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
15970 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a  arted or if the.
15980 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
15990 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64  nt does not read
159a0 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61   or write a data
159b0 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20  base file.  */. 
159c0 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26   if( p->pc>=0 &&
159d0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b   p->bIsReader ){
159e0 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
159f0 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
15a00 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
15a10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
15a20 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
15a30 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
15a40 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
15a50 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
15a60 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
15a70 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
15a80 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
15a90 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
15aa0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
15ab0 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
15ac0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
15ad0 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
15ae0 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
15af0 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
15b00 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53   & 0xff;.    isS
15b10 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
15b20 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
15b30 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
15b40 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
15b50 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
15b60 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
15b70 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
15b80 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
15b90 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
15ba0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
15bb0 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
15bc0 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
15bd0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
15be0 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
15bf0 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
15c00 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
15c10 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
15c20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
15c30 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
15c40 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
15c50 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
15c60 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
15c70 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
15c80 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
15c90 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
15ca0 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
15cb0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
15cc0 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
15cd0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
15ce0 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
15cf0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
15d00 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
15d10 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
15d20 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
15d30 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68    ** occurred wh
15d40 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
15d50 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
15d60 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
15d70 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
15d80 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
15d90 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
15da0 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
15db0 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
15dc0 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
15dd0 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
15de0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
15df0 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
15e00 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
15e10 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
15e20 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
15e30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15e40 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
15e50 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
15e60 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
15e70 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
15e80 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
15e90 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
15ea0 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
15eb0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
15ec0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
15ed0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
15ee0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
15ef0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
15f00 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
15f10 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
15f20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
15f30 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
15f40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
15f50 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
15f60 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
15f70 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
15f80 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
15f90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
15fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
15fb0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
15fc0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
15fd0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
15fe0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
15ff0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
16000 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16010 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
16020 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
16030 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
16040 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16050 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
16060 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
16070 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
16080 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
16090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
160a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
160b0 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
160c0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
160d0 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
160e0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
160f0 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
16100 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
16110 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
16120 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
16130 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
16140 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
16150 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
16160 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
16170 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
16180 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
16190 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
161a0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
161b0 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
161c0 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
161d0 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
161e0 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
161f0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
16200 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
16210 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  & db->nVdbeWrite
16220 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
16230 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
16240 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16250 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
16260 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
16270 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
16280 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
16290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
162a0 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
162b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
162c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
162d0 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
162e0 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
162f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16300 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
16310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
16320 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16330 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
16340 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
16350 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
16360 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
16370 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
16380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
16390 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
163a0 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20   true, the vdbe 
163b0 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63  program was succ
163c0 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20  essful .        
163d0 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27    ** or hit an '
163e0 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
163f0 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
16400 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e no deferred fo
16410 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20  reign.          
16420 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  ** key constrain
16430 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68  ts to hold up th
16440 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
16450 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d  his means a comm
16460 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  it .          **
16470 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
16480 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16490 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
164a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
164b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
164c0 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72  ITE_BUSY && p->r
164d0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
164e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
164f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
16500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16510 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
16520 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
16530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16540 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
16550 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16560 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
16570 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
16580 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
16590 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
165a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
165b0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
165c0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
165d0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
165e0 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  mmCons = 0;.    
165f0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
16600 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f  &= ~(u64)SQLITE_
16610 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20  DeferFKs;.      
16620 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
16630 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
16640 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
16650 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16660 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
16670 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
16680 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
16690 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
166a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
166b0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
166c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
166d0 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
166e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
166f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
16700 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
16710 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
16720 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
16730 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
16740 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
16750 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
16760 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
16770 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
16780 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
16790 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
167a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
167b0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
167c0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
167d0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
167e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
167f0 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
16800 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
16810 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
16820 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
16830 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
16840 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16850 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
16860 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
16870 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
16880 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
16890 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
168a0 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
168b0 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
168c0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
168d0 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
168e0 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
168f0 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
16900 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
16910 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
16920 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
16930 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
16940 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
16950 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
16960 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
16970 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
16980 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
16990 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
169a0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
169b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
169c0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
169d0 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
169e0 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
169f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
16a00 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16a10 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
16a20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
16a30 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
16a40 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
16a50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16a60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16a70 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
16a80 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
16a90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
16aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
16ab0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
16ac0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
16ad0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
16ae0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
16af0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
16b00 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
16b10 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
16b20 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
16b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
16b40 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
16b50 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
16b60 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
16b70 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
16b80 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
16b90 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
16ba0 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
16bb0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
16bc0 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
16bd0 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
16be0 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
16bf0 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
16c00 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
16c10 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
16c20 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
16c30 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
16c40 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
16c50 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
16c60 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
16c70 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
16c80 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
16c90 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
16ca0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
16cb0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
16cc0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
16cd0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
16ce0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
16cf0 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
16d00 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
16d10 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
16d20 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
16d30 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
16d40 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62   ){.    db->nVdb
16d50 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69  eActive--;.    i
16d60 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
16d70 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ) db->nVdbeWrite
16d80 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  --;.    if( p->b
16d90 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e  IsReader ) db->n
16da0 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20  VdbeRead--;.    
16db0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
16dc0 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64  eActive>=db->nVd
16dd0 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73  beRead );.    as
16de0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52  sert( db->nVdbeR
16df0 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ead>=db->nVdbeWr
16e00 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ite );.    asser
16e10 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  t( db->nVdbeWrit
16e20 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  e>=0 );.  }.  p-
16e30 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
16e40 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
16e50 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
16e60 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b);.  if( db->ma
16e70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
16e80 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16e90 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
16ea0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
16eb0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
16ec0 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
16ed0 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
16ee0 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
16ef0 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
16f00 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
16f10 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
16f20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
16f30 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
16f40 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
16f50 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
16f60 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
16f70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
16f80 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
16f90 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
16fa0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
16fb0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
16fc0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
16fd0 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
16fe0 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
16ff0 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
17000 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
17010 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
17020 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
17030 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
17040 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
17050 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
17060 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
17070 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
17080 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
17090 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
170a0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
170b0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
170c0 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
170d0 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
170e0 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
170f0 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
17100 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17110 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
17120 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
17130 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
17140 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
17150 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
17160 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
17170 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
17180 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
17190 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
171a0 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
171b0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
171c0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
171d0 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
171e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
171f0 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
17200 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
17210 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
17220 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
17230 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
17240 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
17250 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
17260 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
17270 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
17280 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
17290 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
172a0 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
172b0 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
172c0 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c  alloc++;.    sql
172d0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
172e0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
172f0 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64   db->pErr==0 ) d
17300 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65  b->pErr = sqlite
17310 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
17320 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
17330 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
17340 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
17350 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
17360 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
17370 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
17380 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
17390 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
173a0 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69  loc--;.  }else i
173b0 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20  f( db->pErr ){. 
173c0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
173d0 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29  etNull(db->pErr)
173e0 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43  ;.  }.  db->errC
173f0 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  ode = rc;.  retu
17400 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
17410 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17420 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
17430 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
17440 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
17450 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
17460 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
17470 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
17480 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17490 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
174a0 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
174b0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
174c0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
174d0 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
174e0 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
174f0 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
17500 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
17510 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
17520 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
17530 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
17540 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
17550 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
17560 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
17570 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
17580 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
17590 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
175a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
175b0 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
175c0 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
175d0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
175e0 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
175f0 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
17600 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
17610 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
17620 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
17630 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
17640 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
17650 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
17660 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
17670 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
17680 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
17690 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
176a0 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
176b0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
176c0 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
176d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
176e0 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
176f0 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
17700 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
17710 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
17720 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
17730 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
17740 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
17750 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
17760 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
17770 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
17780 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
17790 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
177a0 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
177b0 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
177c0 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
177d0 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
177e0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
177f0 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
17800 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
17810 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
17820 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
17830 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
17840 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
17850 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
17860 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
17870 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
17880 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
17890 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
178a0 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
178b0 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
178c0 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
178d0 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
178e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
178f0 44 42 45 20 68 61 73 20 62 65 65 6e 20 72 75 6e  DBE has been run
17900 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
17910 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
17920 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
17930 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
17940 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
17950 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
17960 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
17970 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
17980 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
17990 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
179a0 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
179b0 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
179c0 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
179d0 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
179e0 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
179f0 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
17a00 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
17a10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
17a20 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62  pc>=0 ){.    vdb
17a30 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29  eInvokeSqllog(p)
17a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17a50 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70  eTransferError(p
17a60 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  );.    if( p->ru
17a70 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
17a80 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
17a90 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
17aa0 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
17ab0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
17ac0 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
17ad0 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
17ae0 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
17af0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
17b00 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
17b10 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
17b20 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
17b30 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
17b40 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
17b50 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
17b60 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
17b70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
17b80 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
17b90 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
17ba0 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
17bb0 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
17bc0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
17bd0 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74  register content
17be0 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65 72  s and reclaim er
17bf0 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f  ror message memo
17c00 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ry..  */.#ifdef 
17c10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
17c20 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
17c30 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
17c40 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
17c50 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
17c60 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
17c70 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
17c80 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
17c90 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
17ca0 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
17cb0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
17cc0 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
17cd0 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
17ce0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
17cf0 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  m ){.    for(i=0
17d00 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
17d10 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
17d20 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
17d30 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d  Undefined );.  }
17d40 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
17d50 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
17d60 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
17d70 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
17d80 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
17d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17da0 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74 65 20  BUG.  p->nWrite 
17db0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  = 0;.#endif..  /
17dc0 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
17dd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
17de0 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
17df0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
17e00 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
17e10 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
17e20 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
17e30 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
17e40 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
17e50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
17e60 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
17e70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
17e80 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
17e90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
17ea0 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
17eb0 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
17ec0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
17ed0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
17ee0 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
17ef0 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20          char c, 
17f00 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
17f10 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
17f20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   ");.        for
17f30 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53  (i=0; (c = p->zS
17f40 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  ql[i])!=0; i++){
17f50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17f60 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c=='\n' ) fprint
17f70 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
17f80 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c           putc(c,
17f90 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20   out);.         
17fa0 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20   pc = c;.       
17fb0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
17fc0 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c!='\n' ) fprint
17fd0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
17fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
17ff0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
18000 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
18010 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20  r zHdr[100];.   
18020 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
18030 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64  rintf(sizeof(zHd
18040 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25  r), zHdr, "%6u %
18050 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20  12llu %8llu ",. 
18060 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
18070 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
18080 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
18090 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
180a0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
180b0 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
180c0 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
180d0 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
180e0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
180f0 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72  (out, "%s", zHdr
18100 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18110 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
18120 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
18130 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18140 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
18150 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
18160 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
18170 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20  _MAGIC_RESET;.  
18180 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
18190 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
181a0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
181b0 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
181c0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
181d0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
181e0 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
181f0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
18200 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
18210 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
18220 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
18230 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
18240 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
18250 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
18260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
18270 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
18280 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
18290 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
182a0 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
182b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
182c0 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
182d0 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
182e0 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
182f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
18300 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
18310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18320 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
18330 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
18340 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
18350 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
18360 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
18370 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
18380 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
18390 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
183a0 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
183b0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
183c0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
183d0 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
183e0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
183f0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
18400 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
18410 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
18420 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
18430 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
18440 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
18450 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
18460 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
18470 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
18480 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
18490 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
184a0 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
184b0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
184c0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
184d0 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
184e0 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
184f0 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
18500 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
18510 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
18520 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
18530 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
18540 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
18550 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
18560 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
18570 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
18580 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
18590 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
185a0 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
185b0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
185c0 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64  xData(sqlite3 *d
185d0 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c  b, AuxData **pp,
185e0 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
185f0 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70  sk){.  while( *p
18600 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61  p ){.    AuxData
18610 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20   *pAux = *pp;.  
18620 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20    if( (iOp<0).  
18630 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75     || (pAux->iAu
18640 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20  xOp==iOp.       
18650 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75 78     && pAux->iAux
18660 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  Arg>=0.         
18670 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78 41   && (pAux->iAuxA
18680 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20  rg>31 || !(mask 
18690 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78  & MASKBIT32(pAux
186a0 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20 20  ->iAuxArg)))).  
186b0 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
186c0 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78 41  ase( pAux->iAuxA
186d0 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
186e0 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
186f0 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20  eAux ){.        
18700 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78  pAux->xDeleteAux
18710 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
18720 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
18730 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78  = pAux->pNextAux
18740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
18750 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b  bFree(db, pAux);
18760 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18770 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65    pp= &pAux->pNe
18780 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  xtAux;.    }.  }
18790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
187a0 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
187b0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
187c0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
187d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
187e0 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
187f0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
18800 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
18810 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
18820 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18830 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
18840 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
18850 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
18860 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
18870 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
18880 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
18890 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
188a0 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
188b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
188c0 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
188d0 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
188e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
188f0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
18900 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
18910 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
18920 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
18930 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  t;.  assert( p->
18940 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
18950 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
18960 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
18970 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
18980 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
18990 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72   for(pSub=p->pPr
189a0 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75  ogram; pSub; pSu
189b0 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  b=pNext){.    pN
189c0 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78  ext = pSub->pNex
189d0 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f  t;.    vdbeFreeO
189e0 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d  pArray(db, pSub-
189f0 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29  >aOp, pSub->nOp)
18a00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
18a10 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ree(db, pSub);. 
18a20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69   }.  if( p->magi
18a30 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
18a40 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  IT ){.    releas
18a50 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
18a60 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  r, p->nVar);.   
18a70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18a80 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20  b, p->pVList);. 
18a90 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18aa0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
18ab0 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70    }.  vdbeFreeOp
18ac0 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
18ad0 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
18ae0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18af0 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
18b00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18b10 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65   p->zSql);.#ifde
18b20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18b30 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73 71 6c 69  NORMALIZE.  sqli
18b40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18b50 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 20 20 7b 0a  >zNormSql);.  {.
18b60 20 20 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20      DblquoteStr 
18b70 2a 70 54 68 69 73 2c 20 2a 70 4e 65 78 74 3b 0a  *pThis, *pNext;.
18b80 20 20 20 20 66 6f 72 28 70 54 68 69 73 3d 70 2d      for(pThis=p-
18b90 3e 70 44 62 6c 53 74 72 3b 20 70 54 68 69 73 3b  >pDblStr; pThis;
18ba0 20 70 54 68 69 73 3d 70 4e 65 78 74 29 7b 0a 20   pThis=pNext){. 
18bb0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 54 68       pNext = pTh
18bc0 69 73 2d 3e 70 4e 65 78 74 53 74 72 3b 0a 20 20  is->pNextStr;.  
18bd0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18be0 65 28 64 62 2c 20 70 54 68 69 73 29 3b 0a 20 20  e(db, pThis);.  
18bf0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
18c00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18c10 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
18c20 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  TUS.  {.    int 
18c30 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
18c40 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29  i<p->nScan; i++)
18c50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
18c60 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
18c70 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  an[i].zName);.  
18c80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
18c90 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
18ca0 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  an);.  }.#endif.
18cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
18cc0 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
18cd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18ce0 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
18cf0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
18d00 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
18d10 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
18d20 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
18d30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18d40 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
18d50 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
18d60 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
18d70 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
18d80 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
18d90 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
18da0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
18db0 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
18dc0 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
18dd0 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
18de0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
18df0 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
18e00 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
18e10 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
18e20 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
18e30 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
18e40 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
18e50 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
18e60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
18e70 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65  sor "p" has a pe
18e80 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61  nding seek opera
18e90 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
18ea0 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61  t yet been.** ca
18eb0 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b  rried out.  Seek
18ec0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e   the cursor now.
18ed0 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
18ee0 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
18ef0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
18f00 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
18f10 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
18f20 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
18f30 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56  DeferredMoveto(V
18f40 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
18f50 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
18f60 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
18f70 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
18f80 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
18f90 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  nt;.#endif.  ass
18fa0 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64  ert( p->deferred
18fb0 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65  Moveto );.  asse
18fc0 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
18fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
18fe0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
18ff0 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d  _BTREE );.  rc =
19000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
19010 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75  etoUnpacked(p->u
19020 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  c.pCursor, 0, p-
19030 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
19040 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
19050 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
19060 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
19070 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19080 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
19090 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
190a0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
190b0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
190c0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
190d0 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
190e0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
190f0 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
19100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19110 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
19120 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
19130 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
19140 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
19150 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
19160 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
19170 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
19180 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
19190 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
191a0 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
191b0 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
191c0 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
191d0 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
191e0 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
191f0 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
19200 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
19210 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
19220 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
19230 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
19240 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
19250 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
19260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
19270 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
19280 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
19290 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
192a0 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
192b0 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
192c0 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
192d0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
192e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63  .  assert( p->uc
192f0 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
19300 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19310 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
19320 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
19330 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
19340 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
19350 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75  estore(p->uc.pCu
19360 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65  rsor, &isDiffere
19370 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63  ntRow);.  p->cac
19380 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
19390 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73  _STALE;.  if( is
193a0 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70  DifferentRow ) p
193b0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
193c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
193d0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e  *.** Check to en
193e0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
193f0 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
19400 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
19410 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65  or.** if need be
19420 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f  .  Return any I/
19430 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65  O error from the
19440 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69   restore operati
19450 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
19460 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
19470 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a  ore(VdbeCursor *
19480 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
19490 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
194a0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66  PE_BTREE );.  if
194b0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
194c0 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
194d0 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
194e0 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
194f0 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
19500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19510 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19520 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
19530 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
19540 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
19550 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
19560 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
19570 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
19580 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
19590 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
195a0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
195b0 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
195c0 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
195d0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
195e0 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
195f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
19600 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
19610 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
19620 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
19630 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
19640 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
19650 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
19660 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
19670 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
19680 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
19690 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
196a0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
196b0 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
196c0 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
196d0 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
196e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
196f0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
19700 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
19710 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
19720 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
19730 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
19740 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
19750 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
19760 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19770 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19780 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
19790 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70  (VdbeCursor **pp
197a0 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20  , int *piCol){. 
197b0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d   VdbeCursor *p =
197c0 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74 28 20   *pp;.  assert( 
197d0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
197e0 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d  TYPE_BTREE || p-
197f0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
19800 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20 20 69  PE_PSEUDO );.  i
19810 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
19820 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
19830 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20 70 2d  iMap;.    if( p-
19840 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61  >aAltMap && (iMa
19850 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31  p = p->aAltMap[1
19860 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20  +*piCol])>0 ){. 
19870 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41       *pp = p->pA
19880 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ltCursor;.      
19890 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20  *piCol = iMap - 
198a0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
198b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
198c0 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
198d0 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
198e0 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (p);.  }.  if( s
198f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
19900 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
19910 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
19920 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
19930 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
19940 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19950 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
19960 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
19970 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
19980 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19990 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
199a0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
199b0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
199c0 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
199d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
199e0 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
199f0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
19a00 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
19a10 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
19a20 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
19a30 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
19a40 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
19a50 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
19a60 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
19a70 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
19a80 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
19a90 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
19aa0 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
19ab0 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
19ac0 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
19ad0 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
19ae0 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
19af0 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
19b00 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
19b10 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
19b20 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
19b30 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
19b40 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
19b50 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
19b60 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
19b70 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
19b80 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
19b90 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
19ba0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
19bb0 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
19bc0 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
19bd0 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
19be0 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
19bf0 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
19c00 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
19c10 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
19c20 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
19c30 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eparately..**.**
19c40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
19c50 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
19c60 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
19c70 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
19c80 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
19c90 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
19ca0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
19cb0 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
19cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
19cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
19ce0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
19cf0 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
19d20 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
19d50 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
19d60 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
19d70 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
19d80 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
19d90 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
19dc0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
19dd0 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
19df0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
19e00 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
19e10 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
19e20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
19e30 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
19e40 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e60 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
19e70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
19e80 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
19ea0 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
19eb0 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ed0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19ee0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
19ef0 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
19f20 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
19f30 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
19f60 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
19f70 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
19f80 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
19f90 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
19fa0 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
19fb0 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
19fc0 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
19fd0 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
19fe0 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
19ff0 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
1a000 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
1a010 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
1a020 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
1a030 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
1a040 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
1a050 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
1a060 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
1a070 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
1a080 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
1a090 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
1a0a0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
1a0b0 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
1a0c0 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20  ile_format, u32 
1a0d0 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c  *pLen){.  int fl
1a0e0 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
1a0f0 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61  s;.  u32 n;..  a
1a100 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29  ssert( pLen!=0 )
1a110 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ;.  if( flags&ME
1a120 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Null ){.    *p
1a130 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Len = 0;.    ret
1a140 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1a150 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
1a160 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
1a170 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
1a180 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
1a190 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
1a1a0 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
1a1b0 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
1a1c0 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
1a1d0 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
1a1e0 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
1a1f0 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
1a200 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20       u = ~i;.   
1a210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
1a220 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
1a230 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
1a240 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20     if( (i&1)==i 
1a250 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
1a260 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  4 ){.        *pL
1a270 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
1a280 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b  return 8+(u32)u;
1a290 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a2a0 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b        *pLen = 1;
1a2b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a2c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1a2d0 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
1a2e0 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20  7 ){ *pLen = 2; 
1a2f0 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20  return 2; }.    
1a300 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
1a310 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74  { *pLen = 3; ret
1a320 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28  urn 3; }.    if(
1a330 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
1a340 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74  { *pLen = 4; ret
1a350 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28  urn 4; }.    if(
1a360 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b   u<=MAX_6BYTE ){
1a370 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75   *pLen = 6; retu
1a380 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65  rn 5; }.    *pLe
1a390 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
1a3a0 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
1a3b0 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
1a3c0 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
1a3d0 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
1a3e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
1a3f0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1a400 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
1a410 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
1a420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
1a430 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20  ->n>=0 );.  n = 
1a440 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  (u32)pMem->n;.  
1a450 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
1a460 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
1a470 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
1a480 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b    }.  *pLen = n;
1a490 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
1a4a0 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
1a4b0 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
1a4c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
1a4d0 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70  s for serial typ
1a4e0 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  es less than 128
1a4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1a500 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   u8 sqlite3Small
1a510 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a  TypeSizes[] = {.
1a520 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20          /*  0   
1a530 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20  1   2   3   4   
1a540 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20  5   6   7   8   
1a550 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a  9 */   ./*   0 *
1a560 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20  /   0,  1,  2,  
1a570 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20  3,  4,  6,  8,  
1a580 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31  8,  0,  0,./*  1
1a590 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  0 */   0,  0,  0
1a5a0 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32  ,  0,  1,  1,  2
1a5b0 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a  ,  2,  3,  3,./*
1a5c0 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c    20 */   4,  4,
1a5d0 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c    5,  5,  6,  6,
1a5e0 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c    7,  7,  8,  8,
1a5f0 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20  ./*  30 */   9, 
1a600 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20   9, 10, 10, 11, 
1a610 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20  11, 12, 12, 13, 
1a620 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31  13,./*  40 */  1
1a630 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31  4, 14, 15, 15, 1
1a640 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31  6, 16, 17, 17, 1
1a650 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f  8, 18,./*  50 */
1a660 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30    19, 19, 20, 20
1a670 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32  , 21, 21, 22, 22
1a680 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30  , 23, 23,./*  60
1a690 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c   */  24, 24, 25,
1a6a0 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c   25, 26, 26, 27,
1a6b0 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20   27, 28, 28,./* 
1a6c0 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20   70 */  29, 29, 
1a6d0 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20  30, 30, 31, 31, 
1a6e0 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a  32, 32, 33, 33,.
1a6f0 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33  /*  80 */  34, 3
1a700 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33  4, 35, 35, 36, 3
1a710 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33  6, 37, 37, 38, 3
1a720 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39  8,./*  90 */  39
1a730 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31  , 39, 40, 40, 41
1a740 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33  , 41, 42, 42, 43
1a750 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20  , 43,./* 100 */ 
1a760 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c   44, 44, 45, 45,
1a770 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c   46, 46, 47, 47,
1a780 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20   48, 48,./* 110 
1a790 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20  */  49, 49, 50, 
1a7a0 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20  50, 51, 51, 52, 
1a7b0 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31  52, 53, 53,./* 1
1a7c0 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35  20 */  54, 54, 5
1a7d0 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35  5, 55, 56, 56, 5
1a7e0 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  7, 57.};../*.** 
1a7f0 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
1a800 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
1a810 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1a820 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
1a830 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
1a840 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1a850 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
1a860 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
1a870 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1a880 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  8 ){.    return 
1a890 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
1a8a0 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
1a8b0 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
1a8c0 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20  type<12 .       
1a8d0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
1a8e0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
1a8f0 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72  rial_type]==(ser
1a900 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32  ial_type - 12)/2
1a910 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   );.    return s
1a920 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
1a930 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
1a940 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69  ];.  }.}.u8 sqli
1a950 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65  te3VdbeOneByteSe
1a960 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73  rialTypeLen(u8 s
1a970 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61  erial_type){.  a
1a980 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
1a990 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75  pe<128 );.  retu
1a9a0 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
1a9b0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
1a9c0 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  type];  .}../*.*
1a9d0 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
1a9e0 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
1a9f0 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
1aa00 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
1aa10 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
1aa20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
1aa30 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
1aa40 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
1aa50 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
1aa60 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
1aa70 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
1aa80 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
1aa90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1aaa0 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
1aab0 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
1aac0 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
1aad0 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
1aae0 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
1aaf0 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
1ab00 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
1ab10 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
1ab20 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
1ab30 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
1ab40 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
1ab50 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
1ab60 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
1ab70 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
1ab80 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
1ab90 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
1aba0 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
1abb0 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
1abc0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
1abd0 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
1abe0 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
1abf0 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
1ac00 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
1ac10 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
1ac20 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
1ac30 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
1ac40 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
1ac50 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
1ac60 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
1ac70 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
1ac80 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
1ac90 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
1aca0 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
1acb0 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
1acc0 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
1acd0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
1ace0 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
1acf0 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
1ad00 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
1ad10 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
1ad20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
1ad30 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
1ad40 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
1ad50 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
1ad60 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
1ad70 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
1ad80 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
1ad90 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
1ada0 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
1adb0 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
1adc0 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
1add0 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
1ade0 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
1adf0 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
1ae00 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
1ae10 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
1ae20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
1ae30 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
1ae40 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
1ae50 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
1ae60 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
1ae70 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
1ae80 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
1ae90 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
1aea0 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
1aeb0 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
1aec0 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
1aed0 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
1aee0 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
1aef0 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
1af00 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
1af10 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
1af20 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
1af30 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
1af40 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
1af50 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
1af60 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
1af70 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
1af80 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
1af90 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
1afa0 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
1afb0 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
1afc0 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
1afd0 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
1afe0 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
1aff0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
1b000 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
1b010 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
1b020 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
1b030 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
1b040 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
1b050 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
1b060 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
1b070 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
1b080 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
1b090 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
1b0a0 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
1b0b0 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
1b0c0 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
1b0d0 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
1b0e0 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
1b0f0 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
1b100 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
1b110 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
1b120 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
1b130 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
1b140 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
1b150 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
1b160 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1b170 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
1b180 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
1b190 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
1b1a0 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
1b1b0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
1b1c0 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
1b1d0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1b1e0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1b1f0 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
1b200 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
1b210 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1b220 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
1b230 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
1b240 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
1b250 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
1b260 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69  ].  The caller i
1b270 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a  s responsible.**
1b280 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20   for allocating 
1b290 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
1b2a0 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68  buf[] to hold th
1b2b0 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20  e entire field, 
1b2c0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20  exclusive.** of 
1b2d0 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  the pMem->u.nZer
1b2e0 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45  o bytes for a ME
1b2f0 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a  M_Zero value..**
1b300 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1b310 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1b320 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
1b330 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
1b340 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
1b350 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
1b360 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
1b370 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
1b380 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
1b390 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
1b3a0 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
1b3b0 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32  n buf[]..*/ .u32
1b3c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b3d0 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d  alPut(u8 *buf, M
1b3e0 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65  em *pMem, u32 se
1b3f0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33  rial_type){.  u3
1b400 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
1b410 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
1b420 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
1b430 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
1b440 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
1b450 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
1b460 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1b470 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1b480 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
1b490 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
1b4a0 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  u.r) );.      me
1b4b0 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
1b4c0 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  u.r, sizeof(v));
1b4d0 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
1b4e0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
1b4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b500 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
1b510 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
1b520 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  i = sqlite3Small
1b530 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
1b540 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65  _type];.    asse
1b550 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64  rt( i>0 );.    d
1b560 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69  o{.      buf[--i
1b570 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
1b580 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
1b590 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29  .    }while( i )
1b5a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
1b5b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
1b5c0 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
1b5d0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1b5e0 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
1b5f0 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
1b600 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
1b610 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
1b620 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
1b630 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
1b640 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1b650 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1b660 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
1b670 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28  pMem->n;.    if(
1b680 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28   len>0 ) memcpy(
1b690 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
1b6a0 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
1b6b0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
1b6c0 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
1b6d0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
1b6e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
1b6f0 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
1b700 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
1b710 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
1b720 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
1b730 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1b740 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
1b750 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
1b760 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
1b770 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
1b780 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
1b790 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
1b7a0 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
1b7b0 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
1b7c0 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
1b7d0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1b7e0 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
1b7f0 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1b800 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
1b810 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
1b820 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
1b830 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
1b840 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
1b850 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69  8)|(x)[3]).#defi
1b860 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54  ne FOUR_BYTE_INT
1b870 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69  (x) (16777216*(i
1b880 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
1b890 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
1b8a0 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
1b8b0 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
1b8c0 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
1b8d0 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
1b8e0 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
1b8f0 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
1b900 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1b910 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
1b920 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1b930 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a   bytes read..**.
1b940 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b950 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1b960 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  as two separate 
1b970 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72  routines for per
1b980 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
1b990 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20   few cases that 
1b9a0 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61  require local va
1b9b0 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b  riables are brok
1b9c0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  en out into a se
1b9d0 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e  parate.** routin
1b9e0 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73  e so that in mos
1b9f0 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72  t cases the over
1ba00 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74  head of moving t
1ba10 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  he stack pointer
1ba20 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a  .** is avoided..
1ba30 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53  */ .static u32 S
1ba40 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
1ba50 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
1ba60 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ba70 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
1ba80 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
1ba90 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
1baa0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
1bab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1bac0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
1bad0 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
1bae0 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1bb00 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
1bb10 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
1bb20 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46  /.){.  u64 x = F
1bb30 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
1bb40 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f  f);.  u32 y = FO
1bb50 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
1bb60 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33  +4);.  x = (x<<3
1bb70 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65  2) + y;.  if( se
1bb80 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
1bb90 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1bba0 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37  OF: R-29851-5227
1bbb0 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  2 Value is a big
1bbc0 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20  -endian 64-bit. 
1bbd0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1bbe0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1bbf0 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  /.    pMem->u.i 
1bc00 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1bc10 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1bc20 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74  EM_Int;.    test
1bc30 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1bc40 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
1bc50 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1bc60 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20  : R-57343-49114 
1bc70 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1bc80 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32  ndian IEEE 754-2
1bc90 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  008 64-bit.    *
1bca0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
1bcb0 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20   number. */.#if 
1bcc0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
1bcd0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1bce0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1bcf0 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20  G_POINT).    /* 
1bd00 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
1bd10 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
1bd20 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
1bd30 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
1bd40 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
1bd50 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
1bd60 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
1bd70 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
1bd80 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
1bd90 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
1bda0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
1bdb0 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
1bdc0 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a  .    ** endian..
1bdd0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
1bde0 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
1bdf0 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
1be00 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74  0)<<32;.    stat
1be10 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
1be20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36  r1 = 1.0;.    u6
1be30 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73  4 t2 = t1;.    s
1be40 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1be50 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73  oat(t2);.    ass
1be60 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
1be70 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
1be80 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
1be90 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
1bea0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
1beb0 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
1bec0 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
1bed0 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  ->u.r)==8 );.   
1bee0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1bef0 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65  Float(x);.    me
1bf00 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c  mcpy(&pMem->u.r,
1bf10 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
1bf20 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
1bf30 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
1bf40 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d  pMem->u.r) ? MEM
1bf50 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
1bf60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38  ;.  }.  return 8
1bf70 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56  ;.}.u32 sqlite3V
1bf80 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
1bf90 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bfa0 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
1bfb0 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
1bfc0 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
1bfd0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1bfe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1bff0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
1c000 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
1c010 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
1c040 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
1c050 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
1c060 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1c070 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 7b  {.    case 10: {
1c080 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65   /* Internal use
1c090 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68   only: NULL with
1c0a0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1c0c0 20 55 50 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67   UPDATE no-chang
1c0d0 65 20 66 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20  e flag set */.  
1c0e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1c0f0 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a  = MEM_Null|MEM_Z
1c100 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ero;.      pMem-
1c110 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d  >n = 0;.      pM
1c120 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b  em->u.nZero = 0;
1c130 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c140 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 31 3a    }.    case 11:
1c150 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
1c160 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
1c170 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
1c180 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  /* Null */.     
1c190 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c1a0 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56   R-24078-09375 V
1c1b0 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20  alue is a NULL. 
1c1c0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
1c1d0 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
1c1e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c1f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
1c200 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
1c210 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d  NCE-OF: R-44885-
1c220 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61  25196 Value is a
1c230 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d  n 8-bit twos-com
1c240 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a  plement.      **
1c250 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1c260 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f     pMem->u.i = O
1c270 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  NE_BYTE_INT(buf)
1c280 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1c290 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1c2a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c2b0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1c2c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c2d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1c2e0 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1c2f0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1c300 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c310 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32  OF: R-49794-3502
1c320 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  6 Value is a big
1c330 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20  -endian 16-bit. 
1c340 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1c350 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1c360 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1c370 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  u.i = TWO_BYTE_I
1c380 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1c390 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1c3a0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1c3b0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1c3c0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1c3d0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
1c3e0 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
1c3f0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c400 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1c410 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38  IDENCE-OF: R-378
1c420 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69  39-54301 Value i
1c430 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32  s a big-endian 2
1c440 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  4-bit.      ** t
1c450 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1c460 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1c470 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52   pMem->u.i = THR
1c480 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  EE_BYTE_INT(buf)
1c490 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1c4a0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1c4b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c4c0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1c4d0 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
1c4e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
1c4f0 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
1c500 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1c510 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c520 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37  OF: R-01849-2607
1c530 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  9 Value is a big
1c540 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20  -endian 32-bit. 
1c550 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1c560 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1c570 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1c580 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1c590 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66  INT(buf);.#ifdef
1c5a0 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20   __HP_cc .      
1c5b0 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61  /* Work around a
1c5c0 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20   sign-extension 
1c5d0 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f  bug in the HP co
1c5e0 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58  mpiler for HP/UX
1c5f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75   */.      if( bu
1c600 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d  f[0]&0x80 ) pMem
1c610 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66  ->u.i |= 0xfffff
1c620 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23  fff80000000LL;.#
1c630 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d  endif.      pMem
1c640 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c650 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1c660 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1c670 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
1c680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c690 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
1c6a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c6b0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1c6c0 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d  NCE-OF: R-50385-
1c6d0 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61  09674 Value is a
1c6e0 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62   big-endian 48-b
1c6f0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1c700 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1c710 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1c720 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
1c730 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20  YTE_UINT(buf+2) 
1c740 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1c750 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75  *TWO_BYTE_INT(bu
1c760 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1c770 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c790 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1c7a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
1c7b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1c7c0 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
1c7d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c7e0 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
1c7f0 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
1c800 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  oint */.      /*
1c810 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c   These use local
1c820 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64   variables, so d
1c830 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61  o them in a sepa
1c840 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20  rate routine.   
1c850 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68     ** to avoid h
1c860 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68  aving to move th
1c870 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20  e frame pointer 
1c880 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1c890 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  se */.      retu
1c8a0 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66  rn serialGet(buf
1c8b0 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65  ,serial_type,pMe
1c8c0 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  m);.    }.    ca
1c8d0 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
1c8e0 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
1c8f0 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
1c900 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  er 1 */.      /*
1c910 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c920 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75  12976-22893 Valu
1c930 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
1c940 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   0. */.      /* 
1c950 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1c960 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65  8143-12121 Value
1c970 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
1c980 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  1. */.      pMem
1c990 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
1c9a0 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
1c9b0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1c9c0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
1c9d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
1c9e0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
1c9f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1ca00 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c  -14606-31564 Val
1ca10 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61  ue is a BLOB tha
1ca20 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79  t is (N-12)/2 by
1ca30 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  tes in.      ** 
1ca40 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a  length..      **
1ca50 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1ca60 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75  28401-00140 Valu
1ca70 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e  e is a string in
1ca80 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   the text encodi
1ca90 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ng and.      ** 
1caa0 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69  (N-13)/2 bytes i
1cab0 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20  n length. */.   
1cac0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1cad0 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20  u16 aFlag[] = { 
1cae0 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68  MEM_Blob|MEM_Eph
1caf0 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  em, MEM_Str|MEM_
1cb00 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70  Ephem };.      p
1cb10 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
1cb20 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
1cb30 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  ->n = (serial_ty
1cb40 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
1cb50 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46  pMem->flags = aF
1cb60 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26  lag[serial_type&
1cb70 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1];.      return
1cb80 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a   pMem->n;.    }.
1cb90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1cba0 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  }./*.** This rou
1cbb0 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
1cbc0 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
1cbd0 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
1cbe0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
1cbf0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
1cc00 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
1cc10 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
1cc20 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
1cc30 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
1cc40 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1cc50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
1cc60 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
1cc70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
1cc80 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
1cc90 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
1cca0 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
1ccb0 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
1ccc0 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
1ccd0 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
1cce0 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
1ccf0 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
1cd00 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
1cd10 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
1cd20 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
1cd30 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
1cd40 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
1cd50 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
1cd60 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
1cd70 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
1cd80 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
1cd90 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
1cda0 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
1cdb0 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
1cdc0 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
1cdd0 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
1cde0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1cdf0 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
1ce00 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1ce10 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1ce20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
1ce30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
1ce40 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
1ce50 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
1ce60 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
1ce70 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce90 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1cea0 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29   the record */.)
1ceb0 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
1cec0 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
1ced0 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
1cee0 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
1cef0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1cf20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
1cf30 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42  d for *p */.  nB
1cf40 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
1cf50 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
1cf60 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
1cf70 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  m)*(pKeyInfo->nK
1cf80 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20  eyField+1);.  p 
1cf90 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1cfa0 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
1cfb0 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
1cfc0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
1cfd0 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
1cfe0 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ;.  p->aMem = (M
1cff0 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
1d000 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
1d010 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
1d020 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1d030 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1d040 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
1d050 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1d060 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
1d070 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1d080 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1d090 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1d0a0 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1d0b0 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1d0c0 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1d0d0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1d0e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1d0f0 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1d100 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1d110 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1d120 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1d130 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1d140 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1d150 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1d160 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1d170 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1d180 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1d190 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1d1a0 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1d1b0 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1d1c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d1d0 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1d1e0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1d1f0 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1d200 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1d210 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1d220 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1d230 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1d240 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1d250 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1d260 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1d270 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1d280 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1d290 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 75  char *)pKey;.  u
1d2a0 33 32 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  32 d; .  u32 idx
1d2b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1d2d0 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1d2e0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1d2f0 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d310 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1d320 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1d330 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1d340 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1d350 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1d360 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1d370 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1d380 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1d390 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1d3a0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1d3b0 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1d3c0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1d3d0 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 28 75  x<szHdr && d<=(u
1d3e0 33 32 29 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  32)nKey ){.    u
1d3f0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1d400 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1d410 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
1d420 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
1d430 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
1d440 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1d450 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
1d460 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1d470 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
1d480 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
1d490 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1d4a0 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
1d4b0 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
1d4c0 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
1d4d0 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b      pMem->z = 0;
1d4e0 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
1d4f0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1d500 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
1d510 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
1d520 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28   pMem++;.    if(
1d530 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c   (++u)>=p->nFiel
1d540 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
1d550 20 69 66 28 20 64 3e 28 75 33 32 29 6e 4b 65 79   if( d>(u32)nKey
1d560 20 26 26 20 75 20 29 7b 0a 20 20 20 20 61 73 73   && u ){.    ass
1d570 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1d580 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 61 20 63  );.    /* In a c
1d590 6f 72 72 75 70 74 20 72 65 63 6f 72 64 20 65 6e  orrupt record en
1d5a0 74 72 79 2c 20 74 68 65 20 6c 61 73 74 20 70 4d  try, the last pM
1d5b0 65 6d 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  em might have be
1d5c0 65 6e 20 73 65 74 20 75 70 20 75 73 69 6e 67 20  en set up using 
1d5d0 0a 20 20 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  .    ** uninitia
1d5e0 6c 69 7a 65 64 20 6d 65 6d 6f 72 79 2e 20 4f 76  lized memory. Ov
1d5f0 65 72 77 72 69 74 65 20 69 74 73 20 76 61 6c 75  erwrite its valu
1d600 65 20 77 69 74 68 20 4e 55 4c 4c 2c 20 74 6f 20  e with NULL, to 
1d610 70 72 65 76 65 6e 74 0a 20 20 20 20 2a 2a 20 77  prevent.    ** w
1d620 61 72 6e 69 6e 67 73 20 66 72 6f 6d 20 4d 53 41  arnings from MSA
1d630 4e 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  N. */.    sqlite
1d640 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
1d650 70 4d 65 6d 2d 31 29 3b 0a 20 20 7d 0a 20 20 61  pMem-1);.  }.  a
1d660 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
1d670 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20  fo->nKeyField + 
1d680 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
1d690 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   = u;.}..#ifdef 
1d6a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1d6b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d6c0 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
1d6d0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
1d6e0 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
1d6f0 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
1d700 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1d710 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
1d720 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
1d730 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1d740 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1d750 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1d760 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
1d770 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
1d780 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1d790 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
1d7a0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1d7b0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
1d7c0 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
1d7d0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1d7e0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1d7f0 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
1d800 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
1d810 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1d820 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
1d830 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
1d840 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
1d850 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1d860 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1d870 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
1d880 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
1d890 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
1d8a0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1d8b0 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
1d8c0 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
1d8d0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1d8e0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
1d8f0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1d900 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1d910 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1d920 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1d930 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1d940 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1d950 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
1d960 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1d970 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
1d980 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1d990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1d9a0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1d9b0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1d9c0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
1d9d0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
1d9e0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1d9f0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
1da00 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
1da10 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1da20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1da30 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
1da40 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
1da50 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1da60 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1da70 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1da80 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1da90 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
1daa0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1dab0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
1dac0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1dad0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
1dae0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1daf0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1db00 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1db10 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
1db20 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1db30 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
1db40 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
1db50 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
1db60 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
1db70 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
1db80 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1db90 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1dba0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1dbb0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1dbc0 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
1dbd0 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
1dbe0 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
1dbf0 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
1dc00 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
1dc10 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
1dc20 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
1dc30 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
1dc40 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
1dc50 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
1dc60 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
1dc70 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
1dc80 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
1dc90 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
1dca0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
1dcb0 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
1dcc0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
1dcd0 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
1dce0 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
1dcf0 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
1dd00 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
1dd10 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
1dd20 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
1dd30 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
1dd40 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
1dd50 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1dd60 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
1dd70 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
1dd80 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1dd90 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
1dda0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
1ddb0 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
1ddc0 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
1ddd0 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
1dde0 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1ddf0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1de00 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33    if( szHdr1>983
1de10 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  07 ) return SQLI
1de20 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31  TE_CORRUPT;.  d1
1de30 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
1de40 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1de50 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  AllField>=pPKey2
1de60 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52  ->nField || CORR
1de70 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1de80 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
1de90 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
1dea0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1deb0 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29  o->nKeyField>0 )
1dec0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1ded0 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1dee0 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1def0 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1df00 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
1df10 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
1df20 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
1df30 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
1df40 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
1df50 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
1df60 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
1df70 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
1df80 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
1df90 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
1dfa0 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
1dfb0 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
1dfc0 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
1dfd0 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
1dfe0 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1dff0 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
1e000 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
1e010 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
1e020 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1e030 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
1e040 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
1e050 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
1e060 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
1e070 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
1e080 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
1e090 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
1e0a0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1e0b0 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
1e0c0 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
1e0d0 20 20 20 20 69 66 28 20 64 31 2b 28 75 36 34 29      if( d1+(u64)
1e0e0 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28  serial_type1+2>(
1e0f0 75 36 34 29 6e 4b 65 79 31 0a 20 20 20 20 20 26  u64)nKey1.     &
1e100 26 20 64 31 2b 28 75 36 34 29 73 71 6c 69 74 65  & d1+(u64)sqlite
1e110 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1e120 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
1e130 3e 28 75 36 34 29 6e 4b 65 79 31 20 0a 20 20 20  >(u64)nKey1 .   
1e140 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1e150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
1e160 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1e170 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
1e180 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
1e190 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1e1a0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1e1b0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
1e1c0 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
1e1d0 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
1e1e0 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
1e1f0 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
1e200 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
1e210 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20  Key2->aMem[i],. 
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
1e240 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 69 20  fo->nAllField>i 
1e250 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
1e260 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
1e270 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1e280 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1e290 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
1e2a0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
1e2b0 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  low */.      if(
1e2c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1e2d0 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
1e2e0 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f      rc = -rc;  /
1e2f0 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73  * Invert the res
1e300 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72  ult for DESC sor
1e310 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
1e320 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64    }.      goto d
1e330 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a  ebugCompareEnd;.
1e340 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
1e350 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a   }while( idx1<sz
1e360 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1e370 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f  ->nField );..  /
1e380 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1e390 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1e3a0 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1e3b0 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1e3c0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1e3d0 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
1e3e0 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
1e3f0 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
1e400 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
1e410 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
1e420 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
1e430 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
1e440 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  m1)..  */.  asse
1e450 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1e460 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1e470 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1e480 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
1e490 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1e4a0 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1e4b0 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1e4c0 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1e4d0 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1e4e0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
1e4f0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1e500 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e  .  rc = pPKey2->
1e510 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62  default_rc;..deb
1e520 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20  ugCompareEnd:.  
1e530 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1e540 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20  t==0 && rc==0 ) 
1e550 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1e560 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20  desiredResult<0 
1e570 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  && rc<0 ) return
1e580 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1e590 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e  dResult>0 && rc>
1e5a0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1e5b0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1e5c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1e5d0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1e5e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1e5f0 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
1e600 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
1e610 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1e620 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  G./*.** Count th
1e630 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1e640 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d  ds (a.k.a. colum
1e650 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ns) in the recor
1e660 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b  d given by.** pK
1e670 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65  ey,nKey.  The ve
1e680 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63  rify that this c
1e690 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61  ount is less tha
1e6a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1e6b0 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e  e.** limit given
1e6c0 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41   by pKeyInfo->nA
1e6d0 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  llField..**.** I
1e6e0 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  f this constrain
1e6f0 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  t is not satisfi
1e700 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ed, it means tha
1e710 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64  t the high-speed
1e720 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f  .** vdbeRecordCo
1e730 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1e740 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1e750 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  String() routine
1e760 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
1e770 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  rk correctly.  I
1e780 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  f this assert() 
1e790 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70  ever fires, it p
1e7a0 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a  robably means.**
1e7b0 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66   that the KeyInf
1e7c0 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b  o.nKeyField or K
1e7d0 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64  eyInfo.nAllField
1e7e0 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d   values were com
1e7f0 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65  puted.** incorre
1e800 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
1e810 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46  void vdbeAssertF
1e820 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1e830 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65  imits(.  int nKe
1e840 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  y, const void *p
1e850 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65  Key,   /* The re
1e860 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a  cord to verify *
1e870 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  / .  const KeyIn
1e880 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1e890 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69     /* Compare si
1e8a0 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79  ze with this Key
1e8b0 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Info */.){.  int
1e8c0 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75   nField = 0;.  u
1e8d0 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20  32 szHdr;.  u32 
1e8e0 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73  idx;.  u32 notUs
1e8f0 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ed;.  const unsi
1e900 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1e910 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1e920 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20  d char*)pKey;.. 
1e930 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1e940 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20  ) return;.  idx 
1e950 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1e960 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73  ey, szHdr);.  as
1e970 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b  sert( nKey>=0 );
1e980 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72  .  assert( szHdr
1e990 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20  <=(u32)nKey );. 
1e9a0 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
1e9b0 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20  r ){.    idx += 
1e9c0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1e9d0 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a  +idx, notUsed);.
1e9e0 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20      nField++;.  
1e9f0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  }.  assert( nFie
1ea00 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld <= pKeyInfo->
1ea10 6e 41 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23  nAllField );.}.#
1ea20 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
1ea30 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1ea40 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41  ntWithinLimits(A
1ea50 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,B,C).#endif../*
1ea60 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20  .** Both *pMem1 
1ea70 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61  and *pMem2 conta
1ea80 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73  in string values
1ea90 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77  . Compare the tw
1eaa0 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e  o values.** usin
1eab0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  g the collation 
1eac0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
1ead0 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e  As usual, return
1eae0 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65   a negative , ze
1eaf0 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1eb00 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d  e value if *pMem
1eb10 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1eb20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61  equal to or grea
1eb30 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d  ter than .** *pM
1eb40 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c  em2, respectivel
1eb50 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70  y. Similar in sp
1eb60 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a  irit to "rc = (*
1eb70 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32  pMem1) - (*pMem2
1eb80 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  );"..*/.static i
1eb90 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  nt vdbeCompareMe
1eba0 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  mString(.  const
1ebb0 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63   Mem *pMem1,.  c
1ebc0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1ebd0 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  .  const CollSeq
1ebe0 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70   *pColl,.  u8 *p
1ebf0 72 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20  rcErr           
1ec00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1ec10 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
1ec20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
1ec30 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  MEM */.){.  if( 
1ec40 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  pMem1->enc==pCol
1ec50 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a  l->enc ){.    /*
1ec60 20 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65   The strings are
1ec70 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1ec80 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67  correct encoding
1ec90 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20  .  Call the.    
1eca0 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   ** comparison f
1ecb0 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79  unction directly
1ecc0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
1ecd0 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1ece0 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e  ->pUser,pMem1->n
1ecf0 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d  ,pMem1->z,pMem2-
1ed00 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20  >n,pMem2->z);.  
1ed10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1ed20 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  c;.    const voi
1ed30 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20  d *v1, *v2;.    
1ed40 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20  Mem c1;.    Mem 
1ed50 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  c2;.    sqlite3V
1ed60 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20  dbeMemInit(&c1, 
1ed70 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1ed80 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1ed90 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32  3VdbeMemInit(&c2
1eda0 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1edb0 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1edc0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1edd0 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31  wCopy(&c1, pMem1
1ede0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1edf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1ee00 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c  ShallowCopy(&c2,
1ee10 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65   pMem2, MEM_Ephe
1ee20 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c  m);.    v1 = sql
1ee30 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
1ee40 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
1ee50 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  1, pColl->enc);.
1ee60 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
1ee70 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1ee80 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
1ee90 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1eea0 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32  if( (v1==0 || v2
1eeb0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ==0) ){.      if
1eec0 28 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45  ( prcErr ) *prcE
1eed0 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rr = SQLITE_NOME
1eee0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63  M_BKPT;.      rc
1eef0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1ef00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c  .      rc = pCol
1ef10 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
1ef20 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20  User, c1.n, v1, 
1ef30 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d  c2.n, v2);.    }
1ef40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ef50 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b  MemRelease(&c1);
1ef60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ef70 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b  MemRelease(&c2);
1ef80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1ef90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
1efa0 20 69 6e 70 75 74 20 70 42 6c 6f 62 20 69 73 20   input pBlob is 
1efb0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1efc0 20 61 20 42 6c 6f 62 20 74 68 61 74 20 69 73 20   a Blob that is 
1efd0 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69  not marked.** wi
1efe0 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65  th MEM_Zero.  Re
1eff0 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
1f000 63 6f 75 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d  could be a zero-
1f010 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
1f020 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f  int isAllZero(co
1f030 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
1f040 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   n){.  int i;.  
1f050 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
1f060 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
1f070 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1f080 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1f090 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
1f0a0 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e  o blobs.  Return
1f0b0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1f0c0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1f0d0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20  the first.** is 
1f0e0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1f0f0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1f100 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c  than the second,
1f110 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
1f120 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73  * If one blob is
1f130 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
1f140 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65   other, then the
1f150 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20   shorter is the 
1f160 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54  lessor..*/.SQLIT
1f170 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73  E_NOINLINE int s
1f180 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1f190 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31  e(const Mem *pB1
1f1a0 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32  , const Mem *pB2
1f1b0 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1f1c0 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20  t n1 = pB1->n;. 
1f1d0 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e   int n2 = pB2->n
1f1e0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f  ;..  /* It is po
1f1f0 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61  ssible to have a
1f200 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74   Blob value that
1f210 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65   has some non-ze
1f220 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  ro content.  ** 
1f230 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f  followed by zero
1f240 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74   content.  But t
1f250 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75  hat only comes u
1f260 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d  p for Blobs form
1f270 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f  ed.  ** by the O
1f280 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1f290 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c  ode, and such Bl
1f2a0 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20 70 61  obs never get pa
1f2b0 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
1f2c0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1f2d0 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
1f2e0 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d   (pB1->flags & M
1f2f0 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e  EM_Zero)==0 || n
1f300 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1==0 );.  assert
1f310 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20  ( (pB2->flags & 
1f320 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
1f330 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  n2==0 );..  if( 
1f340 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d  (pB1->flags|pB2-
1f350 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65  >flags) & MEM_Ze
1f360 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  ro ){.    if( pB
1f370 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e  1->flags & pB2->
1f380 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1f390 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f3a0 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1f3b0 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1f3c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d    }else if( pB1-
1f3d0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1f3e0 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  o ){.      if( !
1f3f0 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a  isAllZero(pB2->z
1f400 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75  , pB2->n) ) retu
1f410 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74  rn -1;.      ret
1f420 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1f430 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65   - n2;.    }else
1f440 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1f450 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70  llZero(pB1->z, p
1f460 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B1->n) ) return 
1f470 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1f480 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65   n1 - pB2->u.nZe
1f490 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ro;.    }.  }.  
1f4a0 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
1f4b0 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32  z, pB2->z, n1>n2
1f4c0 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69   ? n2 : n1);.  i
1f4d0 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
1f4e0 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e  .  return n1 - n
1f4f0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  2;.}../*.** Do a
1f500 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
1f510 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67  een a 64-bit sig
1f520 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ned integer and 
1f530 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  a 64-bit floatin
1f540 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65  g-point.** numbe
1f550 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  r.  Return negat
1f560 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1f570 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1f580 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73  rst (i64) is les
1f590 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c  s than,.** equal
1f5a0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1f5b0 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  than the second 
1f5c0 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  (double)..*/.sta
1f5d0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
1f5e0 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69  ntFloatCompare(i
1f5f0 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b  64 i, double r){
1f600 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f  .  if( sizeof(LO
1f610 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38  NGDOUBLE_TYPE)>8
1f620 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42   ){.    LONGDOUB
1f630 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e  LE_TYPE x = (LON
1f640 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a  GDOUBLE_TYPE)i;.
1f650 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65      if( x<r ) re
1f660 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1f670 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   x>r ) return +1
1f680 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1f690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
1f6a0 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73   y;.    double s
1f6b0 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32  ;.    if( r<-922
1f6c0 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
1f6d0 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .0 ) return +1;.
1f6e0 20 20 20 20 69 66 28 20 72 3e 3d 39 32 32 33 33      if( r>=92233
1f6f0 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30  72036854775808.0
1f700 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1f710 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20    y = (i64)r;.  
1f720 20 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75    if( i<y ) retu
1f730 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  rn -1;.    if( i
1f740 3e 79 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >y ) return +1;.
1f750 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29      s = (double)
1f760 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29  i;.    if( s<r )
1f770 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1f780 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e  if( s>r ) return
1f790 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1f7a0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1f7b0 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
1f7c0 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
1f7d0 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
1f7e0 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
1f7f0 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
1f800 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
1f810 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
1f820 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1f830 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
1f840 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
1f850 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
1f860 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
1f870 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
1f880 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
1f890 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
1f8a0 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
1f8b0 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
1f8c0 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   by the collatin
1f8d0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43  g.** sequence pC
1f8e0 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  oll and finally 
1f8f0 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
1f900 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
1f910 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
1f920 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1f930 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
1f940 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1f950 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1f960 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  e(const Mem *pMe
1f970 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  m1, const Mem *p
1f980 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c  Mem2, const Coll
1f990 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
1f9a0 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74  nt f1, f2;.  int
1f9b0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b   combined_flags;
1f9c0 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e  ..  f1 = pMem1->
1f9d0 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d  flags;.  f2 = pM
1f9e0 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f  em2->flags;.  co
1f9f0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66  mbined_flags = f
1fa00 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20  1|f2;.  assert( 
1fa10 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49  !sqlite3VdbeMemI
1fa20 73 52 6f 77 53 65 74 28 70 4d 65 6d 31 29 20 26  sRowSet(pMem1) &
1fa30 26 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65  & !sqlite3VdbeMe
1fa40 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 32 29  mIsRowSet(pMem2)
1fa50 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e   );. .  /* If on
1fa60 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  e value is NULL,
1fa70 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1fa80 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62   the other. If b
1fa90 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  oth values.  ** 
1faa0 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  are NULL, return
1fab0 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63   0..  */.  if( c
1fac0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1fad0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
1fae0 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c  turn (f2&MEM_Nul
1faf0 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c  l) - (f1&MEM_Nul
1fb00 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  l);.  }..  /* At
1fb10 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
1fb20 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20  e two values is 
1fb30 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20  a number.  */.  
1fb40 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1fb50 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  gs&(MEM_Int|MEM_
1fb60 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  Real) ){.    if(
1fb70 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
1fb80 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1fb90 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1fba0 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  < pMem2->u.i ) r
1fbb0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1fbc0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e  if( pMem1->u.i >
1fbd0 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1fbe0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1fbf0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1fc00 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1fc10 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  & MEM_Real)!=0 )
1fc20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1fc30 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.r < pMem2->
1fc40 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.r ) return -1;
1fc50 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1fc60 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.r > pMem2->u
1fc70 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .r ) return +1;.
1fc80 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1fc90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1fca0 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  1&MEM_Int)!=0 ){
1fcb0 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1fcc0 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1fcd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
1fce0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1fcf0 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c  pare(pMem1->u.i,
1fd00 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20   pMem2->u.r);.  
1fd10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fd20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1fd30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fd40 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
1fd50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1fd60 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f2&MEM_Int)!=
1fd70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1fd80 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  urn -sqlite3IntF
1fd90 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1fda0 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75  2->u.i, pMem1->u
1fdb0 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1fdc0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fdd0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1fde0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31   }.    return +1
1fdf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  ;.  }..  /* If o
1fe00 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  ne value is a st
1fe10 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68  ring and the oth
1fe20 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68  er is a blob, th
1fe30 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73  e string is less
1fe40 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
1fe50 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70  re strings, comp
1fe60 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f  are using the co
1fe70 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
1fe80 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  s..  */.  if( co
1fe90 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1fea0 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20  _Str ){.    if( 
1feb0 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f1 & MEM_Str)==
1fec0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1fed0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
1fee0 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72  f( (f2 & MEM_Str
1fef0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1ff00 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
1ff10 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1ff20 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65  1->enc==pMem2->e
1ff30 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d  nc || pMem1->db-
1ff40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1ff50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1ff60 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1ff70 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20  UTF8 || .       
1ff80 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d       pMem1->enc=
1ff90 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
1ffa0 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  || pMem1->enc==S
1ffb0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
1ffc0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ..    /* The col
1ffd0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1ffe0 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20  must be defined 
1fff0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65  at this point, e
20000 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ven if.    ** th
20010 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74  e user deletes t
20020 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
20030 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20  uence after the 
20040 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a  vdbe program is.
20050 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
20060 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c  (this was not al
20070 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a  ways the case)..
20080 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
20090 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f  t( !pColl || pCo
200a0 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20  ll->xCmp );..   
200b0 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
200c0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
200d0 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
200e0 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43  pMem1, pMem2, pC
200f0 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  oll, 0);.    }. 
20100 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20     /* If a NULL 
20110 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73  pointer was pass
20120 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74  ed as the collat
20130 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c  e function, fall
20140 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
20150 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65  to the blob case
20160 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
20170 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f  ).  */.  }. .  /
20180 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
20190 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f  st be blobs.  Co
201a0 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63  mpare using memc
201b0 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75  mp().  */.  retu
201c0 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  rn sqlite3BlobCo
201d0 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65  mpare(pMem1, pMe
201e0 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  m2);.}.../*.** T
201f0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
20200 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
20210 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
20220 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a  erial-type that.
20230 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ** corresponds t
20240 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61  o an integer - a
20250 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  ll values betwee
20260 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73  n 1 and 9 inclus
20270 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37  ive .** except 7
20280 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69  . The second poi
20290 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
202a0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e  containing an in
202b0 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73  teger value.** s
202c0 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64  erialized accord
202d0 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79  ing to serial_ty
202e0 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  pe. This functio
202f0 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a  n deserializes.*
20300 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  * and returns th
20310 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  e value..*/.stat
20320 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72  ic i64 vdbeRecor
20330 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73  dDecodeInt(u32 s
20340 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73  erial_type, cons
20350 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
20360 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20  32 y;.  assert( 
20370 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73  CORRUPT_DB || (s
20380 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26  erial_type>=1 &&
20390 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20   serial_type<=9 
203a0 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  && serial_type!=
203b0 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  7) );.  switch( 
203c0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
203d0 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63     case 0:.    c
203e0 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73  ase 1:.      tes
203f0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
20400 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
20410 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  urn ONE_BYTE_INT
20420 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
20430 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   2:.      testca
20440 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
20450 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20460 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
20470 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a  ey);.    case 3:
20480 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20490 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
204a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48  .      return TH
204b0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
204c0 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20  y);.    case 4: 
204d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
204e0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
204f0 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  ;.      y = FOUR
20500 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
20510 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
20520 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
20530 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
20540 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
20550 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
20560 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20570 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
20580 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
20590 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
205a0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
205b0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a  }.    case 6: {.
205c0 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f        u64 x = FO
205d0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
205e0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
205f0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
20600 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78   );.      x = (x
20610 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
20620 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
20630 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
20640 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  4)*(i64*)&x;.   
20650 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
20660 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
20670 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  8);.}../*.** Thi
20680 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
20690 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
206a0 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
206b0 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
206c0 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
206d0 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
206e0 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
206f0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
20700 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
20710 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
20720 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
20730 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
20740 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
20750 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
20760 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
20770 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
20780 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
20790 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
207a0 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
207b0 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
207c0 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
207d0 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
207e0 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
207f0 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
20800 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  rd..**.** If arg
20810 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e  ument bSkip is n
20820 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  on-zero, it is a
20830 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
20840 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
20850 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  dy.** determined
20860 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
20870 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65  fields of the ke
20880 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a  ys are equal..**
20890 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
208a0 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
208b0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
208c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
208d0 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66  ds. If all .** f
208e0 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61  ields that appea
208f0 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61  r in both keys a
20900 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70  re equal, then p
20910 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
20920 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  c is .** returne
20930 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  d..**.** If data
20940 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
20950 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73  is discovered, s
20960 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  et pPKey2->errCo
20970 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45  de to .** SQLITE
20980 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74  _CORRUPT and ret
20990 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d  urn 0. If an OOM
209a0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
209b0 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79  tered, .** pPKey
209c0 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65  2->errCode is se
209d0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
209e0 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20  M and, if it is 
209f0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a  not NULL, the.**
20a00 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
20a10 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62  lag set on datab
20a20 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65  ase handle (pPKe
20a30 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
20a40 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
20a50 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20a60 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e  reWithSkip(.  in
20a70 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
20a80 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
20a90 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
20aa0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
20ab0 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f  PKey2,         /
20ac0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
20ad0 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20   int bSkip      
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20af0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69   /* If true, ski
20b00 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  p the first fiel
20b10 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  d */.){.  u32 d1
20b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
20b40 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
20b50 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
20b60 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ment */.  int i;
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20b90 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64  ex of next field
20ba0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
20bb0 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f   /* Size of reco
20be0 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  rd header in byt
20bf0 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  es */.  u32 idx1
20c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c10 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
20c20 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20  t of first type 
20c30 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
20c40 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c60 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
20c70 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20  /.  Mem *pRhs = 
20c80 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20  pPKey2->aMem;   
20c90 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c      /* Next fiel
20ca0 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63  d of pPKey2 to c
20cb0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49  ompare */.  KeyI
20cc0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
20cd0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
20ce0 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
20cf0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
20d00 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65  ar *)pKey1;.  Me
20d10 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66  m mem1;..  /* If
20d20 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20   bSkip is true, 
20d30 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
20d40 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65  has already dete
20d50 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
20d60 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65  first.  ** two e
20d70 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b  lements in the k
20d80 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46  eys are equal. F
20d90 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  ix the various s
20da0 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73  tack variables s
20db0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  o.  ** that this
20dc0 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20   routine begins 
20dd0 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65  comparing at the
20de0 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a   second field. *
20df0 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b  /.  if( bSkip ){
20e00 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20  .    u32 s1;.   
20e10 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56   idx1 = 1 + getV
20e20 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
20e30 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64  ], s1);.    szHd
20e40 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20  r1 = aKey1[0];. 
20e50 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b     d1 = szHdr1 +
20e60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
20e70 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20  alTypeLen(s1);. 
20e80 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52     i = 1;.    pR
20e90 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hs++;.  }else{. 
20ea0 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72     idx1 = getVar
20eb0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
20ec0 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73  dr1);.    d1 = s
20ed0 7a 48 64 72 31 3b 0a 20 20 20 20 69 20 3d 20 30  zHdr1;.    i = 0
20ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 31 3e 28  ;.  }.  if( d1>(
20ef0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
20f00 7b 20 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  { .    pPKey2->e
20f10 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
20f20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20f30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  ;.    return 0; 
20f40 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
20f50 2f 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c  /.  }..  VVA_ONL
20f60 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
20f70 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
20f80 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
20f90 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
20fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
20fb0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  2->pKeyInfo->nAl
20fc0 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  lField>=pPKey2->
20fd0 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c  nField .       |
20fe0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
20ff0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
21000 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
21010 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
21020 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
21030 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
21040 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
21050 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
21060 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
21070 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
21080 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
21090 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74  /* RHS is an int
210a0 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  eger */.    if( 
210b0 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
210c0 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  M_Int ){.      s
210d0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
210e0 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
210f0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
21100 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
21110 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
21120 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
21130 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
21140 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
21150 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
21160 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
21170 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
21180 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
21190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
211a0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
211b0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
211c0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
211d0 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69        rc = -sqli
211e0 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
211f0 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65  re(pRhs->u.i, me
21200 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m1.u.r);.      }
21210 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
21220 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
21230 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
21240 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
21250 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
21260 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
21270 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
21280 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
21290 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
212a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
212b0 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
212c0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
212d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
212e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
212f0 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
21300 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
21310 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
21320 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
21330 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
21340 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
21350 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
21360 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69  .        /* Seri
21370 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67  al types 12 or g
21380 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e  reater are strin
21390 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72  gs and blobs (gr
213a0 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20  eater than.     
213b0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20     ** numbers). 
213c0 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20  Types 10 and 11 
213d0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72  are currently "r
213e0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
213f0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  re .        ** u
21400 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  se", so it doesn
21410 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  't really matter
21420 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   what the result
21430 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20  s of comparing. 
21440 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74         ** them t
21450 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65  o numberic value
21460 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  s are.  */.     
21470 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
21480 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
21490 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
214a0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
214b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
214c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
214d0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
214e0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
214f0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
21500 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
21510 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
21520 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70    if( mem1.u.r<p
21530 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
21540 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
21550 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21560 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52   if( mem1.u.r>pR
21570 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
21580 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
21590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
215a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
215b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
215c0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
215d0 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d  (mem1.u.i, pRhs-
215e0 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  >u.r);.        }
215f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21600 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
21610 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
21620 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
21630 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
21640 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
21650 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
21660 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
21670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
21680 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
21690 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
216a0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
216b0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
216c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
216d0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
216e0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
216f0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
21700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
21710 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
21720 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
21730 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21740 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
21750 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
21760 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
21770 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
21780 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
21790 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
217a0 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
217b0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 0a 20 20  nsigned)nKey1.  
217c0 20 20 20 20 20 20 20 7c 7c 20 28 70 4b 65 79 49         || (pKeyI
217d0 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
217e0 65 79 49 6e 66 6f 29 2d 3e 6e 41 6c 6c 46 69 65  eyInfo)->nAllFie
217f0 6c 64 3c 3d 69 0a 20 20 20 20 20 20 20 20 29 7b  ld<=i.        ){
21800 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
21810 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
21820 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
21830 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
21840 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21850 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
21860 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
21870 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
21880 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
21890 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
218a0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
218b0 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
218c0 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
218d0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
218e0 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
218f0 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
21900 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
21910 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
21920 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
21930 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
21940 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
21950 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
21960 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
21970 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
21980 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
21990 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
219a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
219b0 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
219c0 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
219d0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
219e0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
219f0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
21a00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
21a10 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
21a20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
21a30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21a40 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
21a50 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
21a60 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
21a70 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
21a80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21a90 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d  (pRhs->flags & M
21aa0 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70  EM_Zero)==0 || p
21ab0 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  Rhs->n==0 );.   
21ac0 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
21ad0 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
21ae0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
21af0 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
21b00 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
21b10 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
21b20 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61  ype<12 || (seria
21b30 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
21b40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
21b50 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
21b60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72          int nStr
21b70 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
21b80 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
21b90 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
21ba0 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65  +nStr)==(unsigne
21bb0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
21bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
21bd0 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67  +nStr+1)==(unsig
21be0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
21bf0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74       if( (d1+nSt
21c00 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  r) > (unsigned)n
21c10 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
21c20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
21c30 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
21c40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21c50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c70 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
21c80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
21c90 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
21ca0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
21cb0 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c         if( !isAl
21cc0 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61  lZero((const cha
21cd0 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53  r*)&aKey1[d1],nS
21ce0 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tr) ){.         
21cf0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
21d00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21d10 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74          rc = nSt
21d20 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72  r - pRhs->u.nZer
21d30 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
21d40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21d50 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
21d60 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
21d70 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
21d80 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
21d90 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
21da0 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
21db0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
21dc0 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
21dd0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
21de0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21df0 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
21e00 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
21e10 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
21e20 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
21e30 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
21e40 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
21e50 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
21e60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 4b  ){.      if( pPK
21e70 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
21e80 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
21e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
21ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21eb0 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
21ec0 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
21ed0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
21ee0 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20  ey2, rc) );.    
21ef0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
21f00 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
21f10 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
21f20 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
21f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
21f40 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20     i++;.    if( 
21f50 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  i==pPKey2->nFiel
21f60 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  d ) break;.    p
21f70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
21f80 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
21f90 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
21fa0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
21fb0 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
21fc0 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
21fd0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
21fe0 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
21ff0 72 31 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  r1 && d1<=(unsig
22000 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
22010 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
22020 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
22030 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
22040 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
22050 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
22060 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
22070 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
22080 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
22090 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
220a0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
220b0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
220c0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
220d0 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
220e0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
220f0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
22100 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
22110 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
22120 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
22130 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
22140 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
22150 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
22160 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
22170 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
22180 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
22190 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
221a0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
221b0 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
221c0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
221d0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
221e0 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
221f0 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
22200 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
22210 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
22220 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70  cFailed.  );.  p
22230 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
22240 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  1;.  return pPKe
22250 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
22260 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
22270 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
22280 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
22290 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
222a0 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
222b0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
222c0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
222d0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
222e0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
222f0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22300 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
22310 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
22320 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
22330 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22340 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
22350 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
22360 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22370 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
22380 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
22390 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
223a0 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
223b0 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
223c0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
223d0 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
223e0 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
223f0 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
22400 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
22410 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
22420 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
22430 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
22440 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
22450 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
22460 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
22470 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
22480 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
22490 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
224a0 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
224b0 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
224c0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
224d0 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
224e0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
224f0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
22500 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
22510 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
22520 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
22530 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
22540 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
22550 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
22560 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
22570 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
22580 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
22590 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
225a0 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
225b0 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
225c0 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  4 x;.  i64 v;.  
225d0 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65  i64 lhs;..  vdbe
225e0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
225f0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
22600 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
22610 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
22620 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70  assert( (*(u8*)p
22630 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43  Key1)<=0x3F || C
22640 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73  ORRUPT_DB );.  s
22650 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
22660 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
22670 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
22680 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
22690 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f        lhs = ONE_
226a0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
226b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
226c0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
226d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
226e0 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
226f0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
22700 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
22710 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  = TWO_BYTE_INT(a
22720 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
22730 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
22740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22750 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
22760 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
22770 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
22780 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59    lhs = THREE_BY
22790 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
227a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
227b0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
227c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
227d0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
227e0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
227f0 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
22800 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
22810 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  y);.      lhs = 
22820 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
22830 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22840 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
22850 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22860 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
22870 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
22880 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
22890 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
228a0 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
228b0 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
228c0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
228d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
228e0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
228f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
22900 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74  se 6: { /* 8-byt
22910 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
22920 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f   */.      x = FO
22930 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
22940 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  y);.      x = (x
22950 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
22960 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
22970 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36        lhs = *(i6
22980 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73  4*)&x;.      tes
22990 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
229a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
229b0 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a   }.    case 8: .
229c0 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20        lhs = 0;. 
229d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
229e0 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68  case 9:.      lh
229f0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  s = 1;.      bre
22a00 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ak;..    /* This
22a10 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72   case could be r
22a20 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63  emoved without c
22a30 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75  hanging the resu
22a40 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20  lts of running. 
22a50 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e     ** this code.
22a60 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61   Including it ca
22a70 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65  uses gcc to gene
22a80 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77  rate a faster sw
22a90 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61  itch .    ** sta
22aa0 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68  tement (since th
22ab0 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63  e range of switc
22ac0 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74  h targets now st
22ad0 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64  arts at zero and
22ae0 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69  .    ** is conti
22af0 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20  guous) but does 
22b00 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75  not cause any du
22b10 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20  plicate code to 
22b20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  be generated.   
22b30 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63   ** (as gcc is c
22b40 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20  lever enough to 
22b50 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20  combine the two 
22b60 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68  like cases). Oth
22b70 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  er .    ** compi
22b80 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69  lers might be si
22b90 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20  milar.  */ .    
22ba0 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a  case 0: case 7:.
22bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
22bc0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22bd0 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
22be0 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20  y1, pPKey2);..  
22bf0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
22c00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
22c10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22c20 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
22c30 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76  PKey2);.  }..  v
22c40 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
22c50 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e  0].u.i;.  if( v>
22c60 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
22c70 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d   pPKey2->r1;.  }
22c80 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29  else if( v<lhs )
22c90 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
22ca0 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20  y2->r2;.  }else 
22cb0 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
22cc0 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ld>1 ){.    /* T
22cd0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
22ce0 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
22cf0 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61  are equal. Compa
22d00 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  re the trailing 
22d10 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
22d20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71   */.    res = sq
22d30 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22d40 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
22d50 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22d60 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  ey2, 1);.  }else
22d70 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
22d80 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
22d90 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
22da0 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72  ual and there ar
22db0 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20  e no trailing.  
22dc0 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74    ** fields. Ret
22dd0 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
22de0 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63  ult_rc in this c
22df0 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20  ase. */.    res 
22e00 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
22e10 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32  t_rc;.    pPKey2
22e20 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
22e30 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
22e40 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
22e50 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
22e60 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29  , pPKey2, res) )
22e70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
22e80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
22e90 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
22ea0 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
22eb0 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
22ec0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
22ed0 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
22ee0 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
22ef0 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c  ey2 is a string,
22f00 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69   that (b) the fi
22f10 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65  rst field.** use
22f20 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
22f30 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20  sequence BINARY 
22f40 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65  and (c) that the
22f50 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
22f60 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68  varint .** at th
22f70 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
22f80 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
22f90 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
22fa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
22fb0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
22fc0 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65  tring(.  int nKe
22fd0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
22fe0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
22ff0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
23000 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
23010 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
23020 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
23030 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f   u8 *aKey1 = (co
23040 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20  nst u8*)pKey1;. 
23050 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
23060 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
23070 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
23080 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20  aMem[0].flags & 
23090 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62  MEM_Str );.  vdb
230a0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
230b0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
230c0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
230d0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
230e0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
230f0 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74  ey1[1], serial_t
23100 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69  ype);.  if( seri
23110 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
23120 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
23130 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r1;      /* (pKe
23140 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e  y1/nKey1) is a n
23150 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20  umber or a null 
23160 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  */.  }else if( !
23170 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
23180 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73  x01) ){ .    res
23190 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20   = pPKey2->r2;  
231a0 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
231b0 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a  ey1) is a blob *
231c0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
231d0 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74  nt nCmp;.    int
231e0 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73   nStr;.    int s
231f0 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  zHdr = aKey1[0];
23200 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65  ..    nStr = (se
23210 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20  rial_type-12) / 
23220 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64  2;.    if( (szHd
23230 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79  r + nStr) > nKey
23240 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79  1 ){.      pPKey
23250 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
23260 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
23270 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
23280 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72  rn 0;    /* Corr
23290 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
232a0 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20      nCmp = MIN( 
232b0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
232c0 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72  n, nStr );.    r
232d0 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  es = memcmp(&aKe
232e0 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79  y1[szHdr], pPKey
232f0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43  2->aMem[0].z, nC
23300 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65  mp);..    if( re
23310 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  s==0 ){.      re
23320 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79  s = nStr - pPKey
23330 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20  2->aMem[0].n;.  
23340 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
23350 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
23360 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29  Key2->nField>1 )
23370 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
23380 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
23390 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
233a0 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
233b0 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
233c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
233d0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
233e0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
233f0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
23400 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
23410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
23420 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
23430 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
23440 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20  PKey2->r2;.     
23450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23460 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
23470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
23480 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
23490 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
234a0 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c  ey2->r2;.    }el
234b0 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
234c0 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
234d0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
234e0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
234f0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
23500 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
23510 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  s).       || COR
23520 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c  RUPT_DB.       |
23530 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  | pPKey2->pKeyIn
23540 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
23550 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
23560 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
23570 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
23580 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56  r to an sqlite3V
23590 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
235a0 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75  () compatible fu
235b0 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62  nction.** suitab
235c0 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  le for comparing
235d0 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f   serialized reco
235e0 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63  rds to the unpac
235f0 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65  ked record passe
23600 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
23610 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65   argument..*/.Re
23620 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69  cordCompare sqli
23630 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
23640 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  re(UnpackedRecor
23650 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69  d *p){.  /* vari
23660 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
23670 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52  nt() and varintR
23680 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
23690 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65  ng() both assume
236a0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
236b0 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
236c0 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
236d0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
236e0 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a   each record.  *
236f0 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  * fits in a sing
23700 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  le byte (i.e. is
23710 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76   127 or less). v
23720 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
23730 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73  reInt().  ** als
23740 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  o assumes that i
23750 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
23760 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62  rread a buffer b
23770 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a  y at least the .
23780 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73    ** maximum pos
23790 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64  sible legal head
237a0 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62  er size plus 8 b
237b0 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68  ytes. Because th
237c0 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72  ere is.  ** guar
237d0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20  anteed to be at 
237e0 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f  least 74 (but no
237f0 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20  t 136) bytes of 
23800 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  padding followin
23810 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66  g each.  ** buff
23820 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72  er passed to var
23830 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
23840 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73  Int() this makes
23850 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   it convenient t
23860 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65  o.  ** limit the
23870 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
23880 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20  der to 64 bytes 
23890 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74  in cases where t
238a0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20  he first field. 
238b0 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65   ** is an intege
238c0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
238d0 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
238e0 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d  enforce this lim
238f0 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65  it is to conside
23900 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77  r only records w
23910 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c  ith.  ** 13 fiel
23920 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74  ds or less. If t
23930 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69  he first field i
23940 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68  s an integer, th
23950 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a  e maximum legal.
23960 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65    ** header size
23970 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20   is (12*5 + 1 + 
23980 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20  1) bytes.  */.  
23990 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
239a0 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29  >nAllField<=13 )
239b0 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
239c0 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  = p->aMem[0].fla
239d0 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  gs;.    if( p->p
239e0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
239f0 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  der[0] ){.      
23a00 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->r1 = 1;.     
23a10 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20   p->r2 = -1;.   
23a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
23a30 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  >r1 = -1;.      
23a40 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d  p->r2 = 1;.    }
23a50 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
23a60 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20  & MEM_Int) ){.  
23a70 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
23a80 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b  ecordCompareInt;
23a90 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
23aa0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
23ab0 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Real );.    tes
23ac0 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
23ad0 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74  EM_Null );.    t
23ae0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
23af0 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
23b00 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d   if( (flags & (M
23b10 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c  EM_Real|MEM_Null
23b20 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26  |MEM_Blob))==0 &
23b30 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
23b40 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  Coll[0]==0 ){.  
23b50 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
23b60 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
23b70 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
23b80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
23b90 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
23ba0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
23bb0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23bc0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
23bd0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
23be0 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
23bf0 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
23c00 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
23c10 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
23c20 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
23c30 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
23c40 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
23c50 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
23c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
23c70 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
23c80 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
23c90 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
23ca0 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
23cb0 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
23cc0 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
23cd0 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
23ce0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
23cf0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
23d00 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
23d10 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
23d20 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
23d30 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
23d40 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
23d50 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
23d60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23d70 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
23d80 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
23d90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
23da0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
23db0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
23dc0 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
23dd0 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
23de0 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
23df0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
23e00 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
23e10 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
23e20 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
23e30 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
23e40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
23e50 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
23e60 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
23e70 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
23e80 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
23e90 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
23ea0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
23eb0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
23ec0 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
23ed0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
23ee0 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
23ef0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
23f00 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
23f10 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
23f20 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
23f30 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
23f40 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
23f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23f60 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
23f70 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
23f80 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
23f90 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
23fa0 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ur);.  assert( (
23fb0 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
23fc0 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
23fd0 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
23fe0 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
23ff0 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
24000 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
24010 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
24020 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
24030 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
24040 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
24050 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
24060 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
24070 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
24080 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24090 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
240a0 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
240b0 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
240c0 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
240d0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
240e0 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
240f0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
24100 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
24110 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
24120 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
24130 64 72 3e 30 78 37 66 66 66 66 66 66 66 20 29 3b  dr>0x7fffffff );
24140 0a 20 20 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d  .  assert( m.n>=
24150 30 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  0 );.  if( unlik
24160 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73  ely(szHdr<3 || s
24170 7a 48 64 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d  zHdr>(unsigned)m
24180 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
24190 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
241a0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
241b0 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
241c0 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
241d0 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
241e0 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
241f0 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
24200 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
24210 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
24220 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
24230 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
24240 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
24250 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
24260 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
24270 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
24280 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
24290 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
242a0 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
242b0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
242c0 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
242d0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
242e0 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
242f0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
24300 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
24310 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
24320 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
24330 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
24340 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
24350 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
24360 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
24370 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
24380 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
24390 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
243a0 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
243b0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74  SmallTypeSizes[t
243c0 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73  ypeRowid];.  tes
243d0 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
243e0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
243f0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
24400 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
24410 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
24420 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
24430 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
24440 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
24450 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
24460 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
24470 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
24480 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
24490 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
244a0 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
244b0 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
244c0 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
244d0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
244e0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
244f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
24500 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
24510 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
24520 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
24530 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
24540 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
24550 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
24560 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
24570 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
24580 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
24590 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
245a0 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
245b0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
245c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
245d0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
245e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
245f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
24600 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
24610 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
24620 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
24630 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
24640 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
24650 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
24660 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
24670 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
24680 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
24690 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
246a0 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
246b0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
246c0 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
246d0 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
246e0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
246f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
24700 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
24710 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
24720 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
24730 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
24740 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
24750 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
24760 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
24770 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
24780 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
24790 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
247a0 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
247b0 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
247c0 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
247d0 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
247e0 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
247f0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
24800 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
24810 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
24820 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
24830 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
24840 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24860 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
24870 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
24880 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
24890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
248a0 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
248b0 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
248c0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
248d0 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
248e0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
248f0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
24900 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24920 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
24930 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
24940 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
24950 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
24960 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
24970 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d  ursor *pCur;.  M
24980 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
24990 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
249a0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
249b0 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e    pCur = pC->uc.
249c0 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
249d0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
249e0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
249f0 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
24a00 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
24a10 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
24a20 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  ;.  /* nCellKey 
24a30 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
24a40 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
24a50 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
24a60 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
24a70 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
24a80 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
24a90 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
24aa0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
24ab0 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
24ac0 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
24ad0 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
24ae0 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
24af0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24b00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24b10 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
24b20 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
24b30 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
24b40 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
24b50 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
24b60 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
24b70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24b80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24b90 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
24ba0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
24bb0 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e  WithSkip(m.n, m.
24bc0 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29  z, pUnpacked, 0)
24bd0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
24be0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
24bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24c00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
24c10 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
24c20 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
24c30 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
24c40 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
24c50 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
24c60 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
24c70 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
24c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24c90 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
24ca0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
24cb0 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
24cc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
24cd0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
24ce0 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
24cf0 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
24d00 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
24d10 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
24d20 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
24d30 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
24d40 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
24d50 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
24d60 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
24d70 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
24d80 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
24d90 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
24da0 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
24db0 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
24dc0 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
24dd0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
24de0 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
24df0 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
24e00 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
24e10 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
24e20 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
24e30 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
24e40 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
24e50 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
24e60 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
24e70 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
24e80 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
24e90 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
24ea0 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
24eb0 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
24ec0 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
24ed0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
24ee0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
24ef0 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
24f00 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
24f10 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
24f20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
24f30 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
24f40 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
24f50 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
24f60 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20 69 73  *.** If iCode is
24f70 20 31 2c 20 74 68 65 6e 20 65 78 70 69 72 61 74   1, then expirat
24f80 69 6f 6e 20 69 73 20 61 64 76 69 73 6f 72 79 2e  ion is advisory.
24f90 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
24fa0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70  should.** be rep
24fb0 72 65 70 61 72 65 64 20 62 65 66 6f 72 65 20 62  repared before b
24fc0 65 69 6e 67 20 72 65 73 74 61 72 74 65 64 2c 20  eing restarted, 
24fd0 62 75 74 20 69 66 20 69 74 20 69 73 20 61 6c 72  but if it is alr
24fe0 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20  eady running.** 
24ff0 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  it is allowed to
25000 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
25010 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e  on..**.** Intern
25020 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
25030 69 6f 6e 20 6a 75 73 74 20 73 65 74 73 20 74 68  ion just sets th
25040 65 20 56 64 62 65 2e 65 78 70 69 72 65 64 20 66  e Vdbe.expired f
25050 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72  lag on all.** pr
25060 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
25070 73 2e 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  s.  The flag is 
25080 73 65 74 20 74 6f 20 31 20 66 6f 72 20 61 6e 20  set to 1 for an 
25090 69 6d 6d 65 64 69 61 74 65 20 65 78 70 69 72 61  immediate expira
250a0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20  tion.** and set 
250b0 74 6f 20 32 20 66 6f 72 20 61 6e 20 61 64 76 69  to 2 for an advi
250c0 73 6f 72 79 20 65 78 70 69 72 61 74 69 6f 6e 2e  sory expiration.
250d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
250e0 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
250f0 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
25100 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64 65 29   *db, int iCode)
25110 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
25120 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
25130 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
25140 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
25150 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a   = iCode+1;.  }.
25160 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25170 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
25180 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
25190 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
251a0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
251b0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
251c0 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
251d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
251e0 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c  QLITE_PREPARE fl
251f0 61 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a  ags for a Vdbe..
25200 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  */.u8 sqlite3Vdb
25210 65 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64  ePrepareFlags(Vd
25220 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
25230 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d   v->prepFlags;.}
25240 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
25250 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
25260 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
25270 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
25280 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
25290 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
252a0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
252b0 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
252c0 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
252d0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
252e0 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
252f0 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
25300 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
25310 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
25320 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
25330 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
25340 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
25350 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
25360 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
25370 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
25380 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
25390 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
253a0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
253b0 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
253c0 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
253d0 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
253e0 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
253f0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
25400 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
25410 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
25420 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
25430 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62    assert( (v->db
25440 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
25450 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20  _EnableQPSG)==0 
25460 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
25470 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
25480 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
25490 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
254a0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
254b0 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
254c0 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
254d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
254e0 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
254f0 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
25500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
25510 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
25520 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
25530 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
25540 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
25550 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
25560 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
25570 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
25580 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
25590 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
255a0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
255b0 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
255c0 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
255d0 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
255e0 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
255f0 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
25600 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
25610 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
25620 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
25630 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
25640 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
25650 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
25660 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64  .  assert( (v->d
25670 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
25680 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30  E_EnableQPSG)==0
25690 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d   );.  if( iVar>=
256a0 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
256b0 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30  mask |= 0x800000
256c0 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
256d0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
256e0 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
256f0 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  1));.  }.}../*.*
25700 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63 74 69  * Cause a functi
25710 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65  on to throw an e
25720 72 72 6f 72 20 69 66 20 69 74 20 77 61 73 20 63  rror if it was c
25730 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65  all from OP_Pure
25740 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74  Func.** rather t
25750 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e  han OP_Function.
25760 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75  .**.** OP_PureFu
25770 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  nc means that th
25780 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  e function must 
25790 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63  be deterministic
257a0 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  , and should.** 
257b0 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  throw an error i
257c0 66 20 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e  f it is given in
257d0 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20  puts that would 
257e0 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65  make it non-dete
257f0 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68  rministic..** Th
25800 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
25810 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69  voked by date/ti
25820 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  me functions tha
25830 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  t use non-determ
25840 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75  inistic.** featu
25850 72 65 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77  res such as 'now
25860 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  '..*/.int sqlite
25870 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c  3NotPureFunc(sql
25880 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
25890 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  tx){.#ifdef SQLI
258a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
258b0 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70  OR_STAT4.  if( p
258c0 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20  Ctx->pVdbe==0 ) 
258d0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
258e0 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64  .  if( pCtx->pVd
258f0 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f  be->aOp[pCtx->iO
25900 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75  p].opcode==OP_Pu
25910 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  reFunc ){.    sq
25920 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
25930 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
25940 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73   "non-determinis
25950 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  tic function in 
25960 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e  index expression
25970 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   or CHECK constr
25980 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31  aint",.       -1
25990 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
259a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
259b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
259c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
259d0 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ABLE./*.** Trans
259e0 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  fer error messag
259f0 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73  e text from an s
25a00 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72  qlite3_vtab.zErr
25a10 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
25a20 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
25a30 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
25a40 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f  te3_malloc) into
25a50 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20   a Vdbe.zErrMsg 
25a60 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
25a70 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
25a80 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
25a90 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69  bMalloc)..*/.voi
25aa0 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70  d sqlite3VtabImp
25ab0 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a  ortErrmsg(Vdbe *
25ac0 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  p, sqlite3_vtab 
25ad0 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70  *pVtab){.  if( p
25ae0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
25af0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
25b00 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71   = p->db;.    sq
25b10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25b20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
25b30 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71   p->zErrMsg = sq
25b40 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
25b50 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
25b60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
25b70 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
25b80 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e  sg);.    pVtab->
25b90 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
25ba0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25bb0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
25bc0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
25bd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
25be0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f  REUPDATE_HOOK../
25bf0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
25c00 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
25c10 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65  ot NULL, release
25c20 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   any allocations
25c30 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
25c40 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20  with the memory 
25c50 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e  cells in the p->
25c60 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c  aMem[] array. Al
25c70 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61  so free the Unpa
25c80 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
25c90 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20  ructure itself, 
25ca0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
25cb0 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ree()..**.** Thi
25cc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
25cd0 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63  ed to free Unpac
25ce0 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
25cf0 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ures allocated b
25d00 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70  y.** the vdbeUnp
25d10 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63  ackRecord() func
25d20 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64  tion found in vd
25d30 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74  beapi.c..*/.stat
25d40 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
25d50 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33  Unpacked(sqlite3
25d60 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64   *db, int nField
25d70 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  , UnpackedRecord
25d80 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
25d90 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
25da0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c  for(i=0; i<nFiel
25db0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d  d; i++){.      M
25dc0 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
25dd0 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Mem[i];.      if
25de0 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  ( pMem->zMalloc 
25df0 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
25e00 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
25e10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25e20 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
25e30 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
25e40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
25e50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
25e60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
25e70 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
25e80 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  _HOOK./*.** Invo
25e90 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74  ke the pre-updat
25ea0 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20  e hook. If this 
25eb0 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
25ec0 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74  DELETE pre-updat
25ed0 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  e call,.** then 
25ee0 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
25ef0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25f00 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e  ment should poin
25f10 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f  t to the row abo
25f20 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61  ut.** to be upda
25f30 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  te or deleted. I
25f40 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
25f50 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
25f60 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c  preupdate_old(),
25f70 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64  .** the required
25f80 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
25f90 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77  ead from the row
25fa0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
25fb0 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ts to..*/.void s
25fc0 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64  qlite3VdbePreUpd
25fd0 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20  ateHook(.  Vdbe 
25fe0 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
25ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
26000 62 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  be pre-update ho
26010 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  ok is invoked by
26020 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
26030 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
26040 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
26050 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61  to grab old.* va
26060 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  lues from */.  i
26070 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26090 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  * SQLITE_INSERT,
260a0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
260b0 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
260c0 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
260d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
260e0 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62  se name */.  Tab
260f0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26110 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a  Modified table *
26120 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20  /.  i64 iKey1,  
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b      /* Initial k
26150 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  ey value */.  in
26160 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 20  t iReg          
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26180 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65   Register for ne
26190 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  w.* record */.){
261a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
261b0 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b   v->db;.  i64 iK
261c0 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65  ey2;.  PreUpdate
261d0 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f   preupdate;.  co
261e0 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
261f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
26200 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
26210 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20  fakeSortOrder = 
26220 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  0;..  assert( db
26230 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20  ->pPreUpdate==0 
26240 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65  );.  memset(&pre
26250 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f  update, 0, sizeo
26260 66 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20  f(PreUpdate));. 
26270 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
26280 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b  ab)==0 ){.    iK
26290 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b  ey1 = iKey2 = 0;
262a0 0a 20 20 20 20 70 72 65 75 70 64 61 74 65 2e 70  .    preupdate.p
262b0 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
262c0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
262d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
262e0 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  if( op==SQLITE_U
262f0 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  PDATE ){.      i
26300 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69  Key2 = v->aMem[i
26310 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65  Reg].u.i;.    }e
26320 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32  lse{.      iKey2
26330 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a   = iKey1;.    }.
26340 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
26350 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
26360 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20  b->nCol .       
26370 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64  || (pCsr->nField
26380 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26  ==pTab->nCol+1 &
26390 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  & op==SQLITE_DEL
263a0 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29  ETE && iReg==-1)
263b0 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61  .  );..  preupda
263c0 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75  te.v = v;.  preu
263d0 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73  pdate.pCsr = pCs
263e0 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f  r;.  preupdate.o
263f0 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64  p = op;.  preupd
26400 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52  ate.iNewReg = iR
26410 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  eg;.  preupdate.
26420 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b  keyinfo.db = db;
26430 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
26440 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64  info.enc = ENC(d
26450 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  b);.  preupdate.
26460 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
26470 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  d = pTab->nCol;.
26480 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
26490 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d  nfo.aSortOrder =
264a0 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f   (u8*)&fakeSortO
264b0 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74  rder;.  preupdat
264c0 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b  e.iKey1 = iKey1;
264d0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
264e0 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72  y2 = iKey2;.  pr
264f0 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70  eupdate.pTab = p
26500 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Tab;..  db->pPre
26510 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
26520 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
26530 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
26540 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
26550 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
26560 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
26570 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
26580 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
26590 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
265a0 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
265b0 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
265c0 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
265d0 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
265e0 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
265f0 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76  .pUnpacked);.  v
26600 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
26610 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65  db, preupdate.ke
26620 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b  yinfo.nKeyField+
26630 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65  1, preupdate.pNe
26640 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66  wUnpacked);.  if
26650 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  ( preupdate.aNew
26660 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
26670 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
26680 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  sr->nField; i++)
26690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
266a0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70  dbeMemRelease(&p
266b0 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d  reupdate.aNew[i]
266c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
266d0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
266e0 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
266f0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
26700 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
26710 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
26720 2f 0a                                            /.