/ Hex Artifact Content
Login

Artifact 32c003d783af55d0a4ef32516e45ed49a3da6b8a1d98be9b191790a42242996f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1180: 4e 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c  New = (v->nOpAll
1190: 6f 63 3e 3d 35 31 32 20 3f 20 32 2a 28 73 71 6c  oc>=512 ? 2*(sql
11a0: 69 74 65 33 5f 69 6e 74 36 34 29 76 2d 3e 6e 4f  ite3_int64)v->nO
11b0: 70 41 6c 6c 6f 63 0a 20 20 20 20 20 20 20 20 20  pAlloc.         
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
11d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
11e0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
1200: 33 5f 69 6e 74 36 34 20 6e 4e 65 77 20 3d 20 28  3_int64 nNew = (
1210: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 32 2a  v->nOpAlloc ? 2*
1220: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76  (sqlite3_int64)v
1230: 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20 20 20 20 20  ->nOpAlloc.     
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e     : (sqlite3_in
1260: 74 36 34 29 28 31 30 32 34 2f 73 69 7a 65 6f 66  t64)(1024/sizeof
1270: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44  (Op)));.  UNUSED
1280: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b  _PARAMETER(nOp);
1290: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
12a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69  sure that the si
12b0: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65  ze of a VDBE doe
12c0: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c  s not grow too l
12d0: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e  arge */.  if( nN
12e0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d  ew > p->db->aLim
12f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1300: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20  VDBE_OP] ){.    
1310: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1320: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  p->db);.    retu
1330: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1340: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1350: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
1360: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
1370: 72 74 28 20 6e 4e 65 77 3e 3d 28 76 2d 3e 6e 4f  rt( nNew>=(v->nO
1380: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
1390: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
13a0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
13b0: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
13c0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
13d0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73  pNew ){.    p->s
13e0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  zOpAlloc = sqlit
13f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1400: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ->db, pNew);.   
1410: 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70   v->nOpAlloc = p
1420: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65  ->szOpAlloc/size
1430: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61  of(Op);.    v->a
1440: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
1450: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
1460: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1470: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1480: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1490: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
14a0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
14b0: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
14c0: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
14d0: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
14e0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
14f0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
1500: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
1510: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
1520: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
1530: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
1540: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
1550: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
1560: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1570: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1580: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1590: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
15a0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
15b0: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
15c0: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
15d0: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
15e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
15f0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1600: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1610: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1620: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1630: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1640: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
1650: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
1660: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
1670: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1680: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1690: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
16a0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
16d0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
16e0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
16f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1700: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1710: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1720: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1730: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1740: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1750: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
1760: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1770: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
1780: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
1790: 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  ( p->nOpAlloc<=p
17a0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
17b0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
17c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
17d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
17e0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
17f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1800: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1810: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1830: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
1840: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1850: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
1860: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
1870: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
1880: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
1890: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
18a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
18b0: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f  sert( op>=0 && o
18c0: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
18d0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
18e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
18f0: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1900: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1910: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1920: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1930: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1940: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1950: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1960: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1970: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1980: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1990: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
19a0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
19b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19c0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
19d0: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
19e0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
19f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1a00: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1a10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a20: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a30: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a40: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1a50: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1a60: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1a70: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1a80: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1a90: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1aa0: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1ab0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1ac0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1ad0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
1ae0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
1af0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1b00: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1b30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1b40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1b50: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1b60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1b70: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1b80: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1b90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1bb0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1bc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1bd0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1be0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1bf0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c10: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1c20: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
1c30: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1c40: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1c50: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1c60: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1c70: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1c80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1c90: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cb0: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
1cc0: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
1cd0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ce0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
1cf0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
1d00: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
1d10: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
1d20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
1d30: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1d40: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1d50: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1d60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d70: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1d80: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1d90: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1db0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
1dc0: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
1dd0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
1de0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
1df0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
1e00: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
1e10: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
1e20: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
1e30: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1e40: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1e50: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1e60: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1e70: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1e80: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1e90: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1ea0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1eb0: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1ec0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1ed0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
1ee0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
1ef0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
1f00: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
1f10: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
1f20: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
1f30: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
1f40: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
1f50: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
1f60: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
1f70: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  ng does not end 
1f80: 77 69 74 68 20 22 58 22 20 74 68 65 6e 20 61 6e  with "X" then an
1f90: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 69 6e   OP_ResultRow in
1fa0: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  struction.** is 
1fb0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1fc0: 65 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65  e values inserte
1fd0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1fe0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
2000: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
2010: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
2020: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2030: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
2040: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
2050: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
2060: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
2070: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
2080: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
2090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20a0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
20b0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
20c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20d0: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
20e0: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
20f0: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 69 2c  ng8, 0, iDest+i,
2100: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
2110: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 69 27 20  else if( c=='i' 
2120: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2130: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
2140: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
2150: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
2160: 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +i);.    }else{.
2170: 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2180: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b 0a 20 20  op_resultrow;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
21a0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f  3VdbeAddOp2(p, O
21b0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 44 65  P_ResultRow, iDe
21c0: 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f 6f 70 5f  st, i);.skip_op_
21d0: 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20 76 61 5f  resultrow:.  va_
21e0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
21f0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2200: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2210: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
2220: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2240: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2260: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2270: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2280: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2290: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
22b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22c0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
22d0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
22e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
22f0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2300: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2310: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2320: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2330: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
2340: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
2350: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
2360: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
2370: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
2380: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2390: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
23a0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
23b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
23c0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
23d0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
23e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
23f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2400: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2410: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
2420: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
2430: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
2440: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
2450: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2460: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2470: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2480: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2490: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24b0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
24c0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
24d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24e0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
24f0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2500: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2510: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2520: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2530: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2540: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2550: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2560: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2570: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2580: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2590: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
25a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
25b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
25c0: 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44  wNN(sqlite3VdbeD
25d0: 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(p), 8);.  if( 
25e0: 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28  p4copy ) memcpy(
25f0: 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b  p4copy, zP4, 8);
2600: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2610: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f  3VdbeAddOp4(p, o
2620: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70  p, p1, p2, p3, p
2630: 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a  4copy, p4type);.
2640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2650: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
2660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2670: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63  address of the c
2680: 75 72 72 65 6e 74 20 45 58 50 4c 41 49 4e 20 51  urrent EXPLAIN Q
2690: 55 45 52 59 20 50 4c 41 4e 20 62 61 73 65 6c 69  UERY PLAN baseli
26a0: 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 22  ne..** 0 means "
26b0: 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  none"..*/.int sq
26c0: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
26d0: 50 61 72 65 6e 74 28 50 61 72 73 65 20 2a 70 50  Parent(Parse *pP
26e0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 4f 70 20  arse){.  VdbeOp 
26f0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 50 61 72  *pOp;.  if( pPar
2700: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 3d  se->addrExplain=
2710: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2720: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2730: 62 65 47 65 74 4f 70 28 70 50 61 72 73 65 2d 3e  beGetOp(pParse->
2740: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 61  pVdbe, pParse->a
2750: 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 72  ddrExplain);.  r
2760: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 7d  eturn pOp->p2;.}
2770: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 64 65  ../*.** Set a de
2780: 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
2790: 74 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t on the followi
27a0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  ng routine in or
27b0: 64 65 72 20 74 6f 0a 2a 2a 20 6d 6f 6e 69 74 6f  der to.** monito
27c0: 72 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  r the EXPLAIN QU
27d0: 45 52 59 20 50 4c 41 4e 20 63 6f 64 65 20 67 65  ERY PLAN code ge
27e0: 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  neration..*/.#if
27f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2800: 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69  DEBUG).void sqli
2810: 74 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70  te3ExplainBreakp
2820: 6f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  oint(const char 
2830: 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *z1, const char 
2840: 2a 7a 32 29 7b 0a 20 20 28 76 6f 69 64 29 7a 31  *z2){.  (void)z1
2850: 3b 0a 20 20 28 76 6f 69 64 29 7a 32 3b 0a 7d 0a  ;.  (void)z2;.}.
2860: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
2870: 64 20 61 20 6e 65 77 20 4f 50 5f 20 6f 70 63 6f  d a new OP_ opco
2880: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  de..**.** If the
2890: 20 62 50 75 73 68 20 66 6c 61 67 20 69 73 20 74   bPush flag is t
28a0: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  rue, then make t
28b0: 68 69 73 20 6f 70 63 6f 64 65 20 74 68 65 20 70  his opcode the p
28c0: 61 72 65 6e 74 20 66 6f 72 0a 2a 2a 20 73 75 62  arent for.** sub
28d0: 73 65 71 75 65 6e 74 20 45 78 70 6c 61 69 6e 73  sequent Explains
28e0: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 56 64   until sqlite3Vd
28f0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 29 20 69  beExplainPop() i
2900: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69  s called..*/.voi
2910: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  d sqlite3VdbeExp
2920: 6c 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lain(Parse *pPar
2930: 73 65 2c 20 75 38 20 62 50 75 73 68 2c 20 63 6f  se, u8 bPush, co
2940: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2950: 2e 2e 2e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ...){.#ifndef SQ
2960: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
2970: 41 6c 77 61 79 73 20 69 6e 63 6c 75 64 65 20 74  Always include t
2980: 68 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  he OP_Explain op
2990: 63 6f 64 65 73 20 69 66 20 53 51 4c 49 54 45 5f  codes if SQLITE_
29a0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
29b0: 2e 0a 20 20 2a 2a 20 42 75 74 20 6f 6d 69 74 20  ..  ** But omit 
29c0: 74 68 65 6d 20 28 66 6f 72 20 70 65 72 66 6f 72  them (for perfor
29d0: 6d 61 6e 63 65 29 20 64 75 72 69 6e 67 20 70 72  mance) during pr
29e0: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 20  oduction builds 
29f0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
2a00: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
2a10: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 63 68 61  ndif.  {.    cha
2a20: 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62  r *zMsg;.    Vdb
2a30: 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73  e *v;.    va_lis
2a40: 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 69 54  t ap;.    int iT
2a50: 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  his;.    va_star
2a60: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
2a70: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 56   zMsg = sqlite3V
2a80: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a90: 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  db, zFmt, ap);. 
2aa0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
2ab0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
2ac0: 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 73 20  Vdbe;.    iThis 
2ad0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71  = v->nOp;.    sq
2ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2af0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
2b00: 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e 61 64  This, pParse->ad
2b10: 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20  drExplain, 0,.  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e      zMsg, P4_DYN
2b40: 41 4d 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  AMIC);.    sqlit
2b50: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2b60: 69 6e 74 28 62 50 75 73 68 3f 22 50 55 53 48 22  int(bPush?"PUSH"
2b70: 3a 22 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  :"", sqlite3Vdbe
2b80: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 70 34 2e  GetOp(v,-1)->p4.
2b90: 7a 29 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73  z);.    if( bPus
2ba0: 68 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  h){.      pParse
2bb0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
2bc0: 69 54 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  iThis;.    }.  }
2bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68  .}../*.** Pop th
2be0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
2bf0: 50 4c 41 4e 20 73 74 61 63 6b 20 6f 6e 65 20 6c  PLAN stack one l
2c00: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
2c10: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
2c20: 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
2c30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e){.  sqlite3Exp
2c40: 6c 61 69 6e 42 72 65 61 6b 70 6f 69 6e 74 28 22  lainBreakpoint("
2c50: 50 4f 50 22 2c 20 30 29 3b 0a 20 20 70 50 61 72  POP", 0);.  pPar
2c60: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20  se->addrExplain 
2c70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
2c80: 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 72 73  lainParent(pPars
2c90: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
2ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2cb0: 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  AIN */../*.** Ad
2cc0: 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68  d an OP_ParseSch
2cd0: 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ema opcode.  Thi
2ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f  s routine is bro
2cf0: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  ken out from.** 
2d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d10: 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65  4() since it nee
2d20: 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73  ds to also needs
2d30: 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72   to mark all btr
2d40: 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67  ees.** as having
2d50: 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a   been used..**.*
2d60: 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72  * The zWhere str
2d70: 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  ing must have be
2d80: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2d90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2da0: 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  )..** This routi
2db0: 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e  ne will take own
2dc0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c  ership of the al
2dd0: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a  located memory..
2de0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2df0: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
2e00: 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  aOp(Vdbe *p, int
2e10: 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65   iDb, char *zWhe
2e20: 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  re){.  int j;.  
2e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e40: 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(p, OP_ParseSch
2e50: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ema, iDb, 0, 0, 
2e60: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
2e70: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
2e80: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
2e90: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
2ea0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
2ec0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
2ed0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
2ee0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
2ef0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2f00: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
2f10: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
2f20: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
2f30: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
2f40: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f60: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2f70: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2f80: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2f90: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2fa0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2fb0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fe0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2ff0: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
3000: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
3010: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
3020: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
3030: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3040: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
3050: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
3060: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
3070: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
3080: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3090: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
30a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
30b0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70   P4_INT32;.    p
30c0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20  Op->p4.i = p4;. 
30d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
30e0: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74  ;.}../* Insert t
30f0: 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72  he end of a co-r
3100: 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73  outine.*/.void s
3110: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
3120: 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20  outine(Vdbe *v, 
3130: 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20  int regYield){. 
3140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3150: 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
3160: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
3170: 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68  ;..  /* Clear th
3180: 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  e temporary regi
3190: 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72  ster cache, ther
31a0: 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61  eby ensuring tha
31b0: 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72  t each.  ** co-r
31c0: 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f  outine has its o
31d0: 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  wn independent s
31e0: 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c  et of registers,
31f0: 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74   because co-rout
3200: 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20  ines.  ** might 
3210: 65 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67  expect their reg
3220: 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65  isters to be pre
3230: 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e  served across an
3240: 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20   OP_Yield, and. 
3250: 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63   ** that could c
3260: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66  ause problems if
3270: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d   two or more co-
3280: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69  routines are usi
3290: 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  ng the same.  **
32a0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
32b0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70  ter..  */.  v->p
32c0: 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
32d0: 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65  = 0;.  v->pParse
32e0: 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
32f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3300: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
3310: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
3320: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
3330: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
3340: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
3350: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
3360: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
3370: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
3380: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
3390: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
33a0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
33b0: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
33c0: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
33d0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
33e0: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
33f0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
3400: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
3410: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
3420: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
3430: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
3440: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
3450: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
3460: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
3470: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
3480: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
3490: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
34a0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
34b0: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
34c0: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
34d0: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
34e0: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
34f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
3500: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
3510: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
3520: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
3530: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
3540: 2a 20 28 4c 61 74 65 72 3a 29 20 54 68 69 73 20  * (Later:) This 
3550: 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72  is only true for
3560: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 68 61   opcodes that ha
3570: 76 65 20 74 68 65 20 4f 50 46 4c 47 5f 4a 55 4d  ve the OPFLG_JUM
3580: 50 0a 2a 2a 20 70 72 6f 70 65 72 74 79 2e 0a 2a  P.** property..*
3590: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 75 73  *.** Variable us
35a0: 61 67 65 20 6e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a  age notes:.**.**
35b0: 20 20 20 20 20 50 61 72 73 65 2e 61 4c 61 62 65       Parse.aLabe
35c0: 6c 5b 78 5d 20 20 20 20 20 53 74 6f 72 65 73 20  l[x]     Stores 
35d0: 74 68 65 20 61 64 64 72 65 73 73 20 74 68 61 74  the address that
35e0: 20 74 68 65 20 78 2d 74 68 20 6c 61 62 65 6c 20   the x-th label 
35f0: 72 65 73 6f 6c 76 65 73 0a 2a 2a 20 20 20 20 20  resolves.**     
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 69 6e 74 6f 2e 20 20 46 6f 72 20 74      into.  For t
3620: 65 73 74 69 6e 67 20 28 53 51 4c 49 54 45 5f 44  esting (SQLITE_D
3630: 45 42 55 47 29 2c 20 75 6e 72 65 73 6f 6c 76 65  EBUG), unresolve
3640: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 62               lab
3660: 65 6c 73 20 73 74 6f 72 65 73 20 2d 31 2c 20 62  els stores -1, b
3670: 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 72  ut that is not r
3680: 65 71 75 69 72 65 64 2e 0a 2a 2a 20 20 20 20 20  equired..**     
3690: 50 61 72 73 65 2e 6e 4c 61 62 65 6c 41 6c 6c 6f  Parse.nLabelAllo
36a0: 63 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c  c   Number of sl
36b0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ots allocated to
36c0: 20 50 61 72 73 65 2e 61 4c 61 62 65 6c 5b 5d 0a   Parse.aLabel[].
36d0: 2a 2a 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61  **     Parse.nLa
36e0: 62 65 6c 20 20 20 20 20 20 20 20 54 68 65 20 2a  bel        The *
36f0: 6e 65 67 61 74 69 76 65 2a 20 6f 66 20 74 68 65  negative* of the
3700: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c   number of label
3710: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 62 65 65 6e 20 69 73 73 75         been issu
3740: 65 64 2e 20 20 54 68 65 20 6e 65 67 61 74 69 76  ed.  The negativ
3750: 65 20 69 73 20 73 74 6f 72 65 64 20 62 65 63 61  e is stored beca
3760: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  use.**          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3780: 68 61 74 20 67 69 76 65 73 20 61 20 70 65 72 66  hat gives a perf
3790: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
37a0: 65 6e 74 20 6f 76 65 72 20 73 74 6f 72 69 6e 67  ent over storing
37b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
37d0: 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69 74  equivalent posit
37e0: 69 76 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e  ive value..*/.in
37f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
3800: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 50  eLabel(Parse *pP
3810: 61 72 73 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  arse){.  return 
3820: 2d 2d 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  --pParse->nLabel
3830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
3840: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
3850: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
3860: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3870: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
3880: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
3890: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
38a0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
38b0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
38c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
38d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
38e0: 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  l()..*/.static S
38f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
3900: 6f 69 64 20 72 65 73 69 7a 65 52 65 73 6f 6c 76  oid resizeResolv
3910: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 2c  eLabel(Parse *p,
3920: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6a 29   Vdbe *v, int j)
3930: 7b 0a 20 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  {.  int nNewSize
3940: 20 3d 20 31 30 20 2d 20 70 2d 3e 6e 4c 61 62 65   = 10 - p->nLabe
3950: 6c 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  l;.  p->aLabel =
3960: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
3970: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
3980: 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20  ->aLabel,.      
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
39a0: 4e 65 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70  NewSize*sizeof(p
39b0: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20  ->aLabel[0]));. 
39c0: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d   if( p->aLabel==
39d0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  0 ){.    p->nLab
39e0: 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  elAlloc = 0;.  }
39f0: 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
3a00: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 6e  ITE_DEBUG.    in
3a10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
3a20: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20 69  ->nLabelAlloc; i
3a30: 3c 6e 4e 65 77 53 69 7a 65 3b 20 69 2b 2b 29 20  <nNewSize; i++) 
3a40: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
3a50: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  1;.#endif.    p-
3a60: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 6e  >nLabelAlloc = n
3a70: 4e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 2d 3e  NewSize;.    p->
3a80: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3a90: 4f 70 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  Op;.  }.}.void s
3aa0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
3ab0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
3ac0: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
3ad0: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
3ae0: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
3af0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
3b00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3b10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3b20: 72 74 28 20 6a 3c 2d 70 2d 3e 6e 4c 61 62 65 6c  rt( j<-p->nLabel
3b30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
3b40: 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
3b50: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
3b60: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
3b70: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
3b80: 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
3b90: 74 66 28 22 52 45 53 4f 4c 56 45 20 4c 41 42 45  tf("RESOLVE LABE
3ba0: 4c 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 78  L %d to %d\n", x
3bb0: 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 7d 0a 23  , v->nOp);.  }.#
3bc0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e  endif.  if( p->n
3bd0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 2b 20 70 2d 3e  LabelAlloc + p->
3be0: 6e 4c 61 62 65 6c 20 3c 20 30 20 29 7b 0a 20 20  nLabel < 0 ){.  
3bf0: 20 20 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c    resizeResolveL
3c00: 61 62 65 6c 28 70 2c 76 2c 6a 29 3b 0a 20 20 7d  abel(p,v,j);.  }
3c10: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
3c20: 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d  ( p->aLabel[j]==
3c30: 28 2d 31 29 20 29 3b 20 2f 2a 20 4c 61 62 65 6c  (-1) ); /* Label
3c40: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
3c50: 73 6f 6c 76 65 64 20 6f 6e 63 65 20 2a 2f 0a 20  solved once */. 
3c60: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20     p->aLabel[j] 
3c70: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a  = v->nOp;.  }.}.
3c80: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3c90: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3ca0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3cb0: 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f   one time..*/.vo
3cc0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  id sqlite3VdbeRu
3cd0: 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a  nOnlyOnce(Vdbe *
3ce0: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
3cf0: 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Once = 1;.}../*.
3d00: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
3d10: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
3d20: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c   only be run mul
3d30: 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a  tiple times..*/.
3d40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3d50: 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70  Reusable(Vdbe *p
3d60: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
3d70: 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64  nce = 0;.}..#ifd
3d80: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
3d90: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
3da0: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
3db0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
3dc0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
3dd0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
3de0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
3df0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3e00: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
3e10: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
3e20: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
3e30: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
3e40: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
3e50: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
3e60: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
3e70: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
3e80: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3e90: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
3ea0: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
3eb0: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
3ec0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
3ed0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
3ee0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
3f10: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
3f20: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
3f30: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3f40: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
3f50: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
3f60: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
3f70: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
3f80: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
3f90: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
3fa0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3fb0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
3fc0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
3fd0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
3fe0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
3ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
4000: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
4010: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
4020: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
4030: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
4040: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4050: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
4060: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4080: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4090: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
40a0: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
40b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
40c0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
40d0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
40e0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
40f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4100: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
4110: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
4120: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
4130: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
4140: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
4150: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
4160: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
4170: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
4180: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
4190: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
41a0: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
41b0: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
41c0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
41d0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
41e0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
41f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4200: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
4210: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
4220: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
4230: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
4240: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
4250: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
4260: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
4270: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
4280: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
4290: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
42a0: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
42b0: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
42c0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
42d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
42e0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
42f0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
4300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
4310: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
4320: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
4330: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
4340: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
4350: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
4360: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4370: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
4380: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
4390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
43a0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
43b0: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
43c0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
43d0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
43e0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
43f0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
4400: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
4410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
4420: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4440: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
4450: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
4460: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
4470: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4480: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
4490: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
44a0: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
44b0: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
44c0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
44d0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
44e0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
44f0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
4500: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
4510: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
4520: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
4530: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
4540: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
4550: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
4560: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
4570: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
4580: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
4590: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
45a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
45b0: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
45c0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
45d0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
45e0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
45f0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
4600: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
4610: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
4620: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
4630: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
4640: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
4650: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
4660: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
4670: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
4680: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
4690: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
46a0: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
46b0: 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f 49  ateBtree/BTREE_I
46c0: 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e 69  NTKEY and OP_Ini
46d0: 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 20  tCoroutine .**  
46e0: 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45 20      (for CREATE 
46f0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
4700: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
4710: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
4720: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
4730: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
4740: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
4750: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
4760: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
4770: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4780: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
4790: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
47a0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
47b0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
47c0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
47d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
47e0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
47f0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
4800: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
4810: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4820: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
4830: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
4840: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
4850: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
4860: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
4870: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
4880: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
4890: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
48a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
48b0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
48c0: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
48d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
48e0: 43 72 65 61 74 65 49 6e 64 65 78 20 3d 20 30 3b  CreateIndex = 0;
48f0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
4900: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
4910: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
4920: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
4930: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
4940: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
4950: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
4960: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
4970: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
4980: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
4990: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
49a0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
49b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
49c0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
49d0: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
49e0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
49f0: 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d       || opcode==
4a00: 4f 50 5f 56 44 65 73 74 72 6f 79 0a 20 20 20 20  OP_VDestroy.    
4a10: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
4a20: 46 75 6e 63 74 69 6f 6e 30 20 26 26 20 70 4f 70  Function0 && pOp
4a30: 2d 3e 70 34 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  ->p4.pFunc->func
4a40: 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
4a50: 43 5f 49 4e 54 45 52 4e 41 4c 29 0a 20 20 20 20  C_INTERNAL).    
4a60: 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50   || ((opcode==OP
4a70: 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d  _Halt || opcode=
4a80: 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20  =OP_HaltIfNull) 
4a90: 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d  .      && ((pOp-
4aa0: 3e 70 31 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  >p1)!=SQLITE_OK 
4ab0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41  && pOp->p2==OE_A
4ac0: 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20  bort)).    ){.  
4ad0: 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31      hasAbort = 1
4ae0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4af0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
4b00: 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74  ode==OP_CreateBt
4b10: 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ree && pOp->p3==
4b20: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20 68  BTREE_INTKEY ) h
4b30: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
4b40: 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  1;.    if( opcod
4b50: 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74 72 65  e==OP_CreateBtre
4b60: 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 42 54  e && pOp->p3==BT
4b70: 52 45 45 5f 42 4c 4f 42 4b 45 59 20 29 20 68 61  REE_BLOBKEY ) ha
4b80: 73 43 72 65 61 74 65 49 6e 64 65 78 20 3d 20 31  sCreateIndex = 1
4b90: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
4ba0: 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  ==OP_InitCorouti
4bb0: 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f  ne ) hasInitCoro
4bc0: 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64  utine = 1;.#ifnd
4bd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
4be0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69  OREIGN_KEY.    i
4bf0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b  f( opcode==OP_Fk
4c00: 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e  Counter && pOp->
4c10: 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  p1==0 && pOp->p2
4c20: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ==1 ){.      has
4c30: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20  FkCounter = 1;. 
4c40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
4c50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4c60: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
4c70: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
4c80: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
4c90: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
4ca0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
4cb0: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
4cc0: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
4cd0: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
4ce0: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
4cf0: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
4d00: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
4d10: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
4d20: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
4d30: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
4d40: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
4d50: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
4d60: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
4d70: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
4d80: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
4d90: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
4da0: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
4db0: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
4dc0: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
4dd0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c  ort==mayAbort ||
4de0: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20   hasFkCounter.  
4df0: 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65        || (hasCre
4e00: 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49  ateTable && hasI
4e10: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 7c 7c  nitCoroutine) ||
4e20: 20 68 61 73 43 72 65 61 74 65 49 6e 64 65 78 0a   hasCreateIndex.
4e30: 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a    );.}.#endif /*
4e40: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20   SQLITE_DEBUG - 
4e50: 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65 72  the sqlite3Asser
4e60: 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63  tMayAbort() func
4e70: 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  tion */..#ifdef 
4e80: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
4e90: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
4ea0: 20 6e 57 72 69 74 65 20 63 6f 75 6e 74 65 72 20   nWrite counter 
4eb0: 69 6e 20 74 68 65 20 56 44 42 45 20 69 66 20 74  in the VDBE if t
4ec0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
4ed0: 20 61 6e 0a 2a 2a 20 65 70 68 65 6d 65 72 61 6c   an.** ephemeral
4ee0: 20 63 75 72 73 6f 72 2c 20 6f 72 20 69 66 20 74   cursor, or if t
4ef0: 68 65 20 63 75 72 73 6f 72 20 61 72 67 75 6d 65  he cursor argume
4f00: 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76  nt is NULL..*/.v
4f10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
4f20: 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28  ncrWriteCounter(
4f30: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
4f40: 73 6f 72 20 2a 70 43 29 7b 0a 20 20 69 66 28 20  sor *pC){.  if( 
4f50: 70 43 3d 3d 30 0a 20 20 20 7c 7c 20 28 70 43 2d  pC==0.   || (pC-
4f60: 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
4f70: 50 45 5f 53 4f 52 54 45 52 0a 20 20 20 20 20 20  PE_SORTER.      
4f80: 20 26 26 20 70 43 2d 3e 65 43 75 72 54 79 70 65   && pC->eCurType
4f90: 21 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f  !=CURTYPE_PSEUDO
4fa0: 0a 20 20 20 20 20 20 20 26 26 20 21 70 43 2d 3e  .       && !pC->
4fb0: 69 73 45 70 68 65 6d 65 72 61 6c 29 0a 20 20 29  isEphemeral).  )
4fc0: 7b 0a 20 20 20 20 70 2d 3e 6e 57 72 69 74 65 2b  {.    p->nWrite+
4fd0: 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  +;.  }.}.#endif.
4fe0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4ff0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72  EBUG./*.** Asser
5000: 74 20 69 66 20 61 6e 20 41 62 6f 72 74 20 61 74  t if an Abort at
5010: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
5020: 69 6d 65 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ime might result
5030: 20 69 6e 20 61 20 63 6f 72 72 75 70 74 0a 2a 2a   in a corrupt.**
5040: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
5050: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  id sqlite3VdbeAs
5060: 73 65 72 74 41 62 6f 72 74 61 62 6c 65 28 56 64  sertAbortable(Vd
5070: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
5080: 28 20 70 2d 3e 6e 57 72 69 74 65 3d 3d 30 20 7c  ( p->nWrite==0 |
5090: 7c 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  | p->usesStmtJou
50a0: 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  rnal );.}.#endif
50b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
50c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
50d0: 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73  fter all opcodes
50e0: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
50f0: 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a  ted.  It loops.*
5100: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  * through all th
5110: 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69  e opcodes and fi
5120: 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61  xes up some deta
5130: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46  ils..**.** (1) F
5140: 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73  or each jump ins
5150: 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20  truction with a 
5160: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
5170: 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20  e (a label).**  
5180: 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50     resolve the P
5190: 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63  2 value to an ac
51a0: 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a  tual address..**
51b0: 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20  .** (2) Compute 
51c0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
51d0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
51e0: 75 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20  used by any SQL 
51f0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  function.**     
5200: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76  and store that v
5210: 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e  alue in *pMaxFun
5220: 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29  cArgs..**.** (3)
5230: 20 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65   Update the Vdbe
5240: 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64  .readOnly and Vd
5250: 62 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61  be.bIsReader fla
5260: 67 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79  gs to accurately
5270: 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65  .**     indicate
5280: 20 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72   what the prepar
5290: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74  ed statement act
52a0: 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a  ually does..**.*
52b0: 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65  * (4) Initialize
52c0: 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65   the p4.xAdvance
52d0: 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f   pointer on opco
52e0: 64 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e  des that use it.
52f0: 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61  .**.** (5) Recla
5300: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  im the memory al
5310: 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72  located for stor
5320: 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a  ing labels..**.*
5330: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
5340: 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f  ill only functio
5350: 6e 20 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74  n correctly if t
5360: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5370: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63   generator.** sc
5380: 72 69 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65  ript numbers the
5390: 20 6f 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74   opcodes correct
53a0: 6c 79 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20  ly.  Changes to 
53b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  this routine mus
53c0: 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61  t be.** coordina
53d0: 74 65 64 20 77 69 74 68 20 63 68 61 6e 67 65 73  ted with changes
53e0: 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63   to mkopcodeh.tc
53f0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
5400: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
5410: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
5420: 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20  pMaxFuncArgs){. 
5430: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
5440: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
5450: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73   Op *pOp;.  Pars
5460: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
5470: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c  Parse;.  int *aL
5480: 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61  abel = pParse->a
5490: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
54a0: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62  Only = 1;.  p->b
54b0: 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  IsReader = 0;.  
54c0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  pOp = &p->aOp[p-
54d0: 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65  >nOp-1];.  while
54e0: 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  (1){..    /* Onl
54f0: 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61  y JUMP opcodes a
5500: 6e 64 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73  nd the short lis
5510: 74 20 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63  t of special opc
5520: 6f 64 65 73 20 69 6e 20 74 68 65 20 73 77 69 74  odes in the swit
5530: 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20  ch.    ** below 
5540: 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
5550: 64 65 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70  dered.  The mkop
5560: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
5570: 74 6f 72 20 73 63 72 69 70 74 20 67 72 6f 75 70  tor script group
5580: 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65  s.    ** all the
5590: 73 65 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74  se opcodes toget
55a0: 68 65 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f  her near the fro
55b0: 6e 74 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nt of the opcode
55c0: 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20   list.  Skip.   
55d0: 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74   ** any opcode t
55e0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
55f0: 64 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20  d processing by 
5600: 76 69 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66  virtual of the f
5610: 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  act that.    ** 
5620: 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  it is larger tha
5630: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5640: 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65  _OPCODE, as a pe
5650: 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
5660: 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  zation..    */. 
5670: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
5680: 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55  de<=SQLITE_MX_JU
5690: 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20  MP_OPCODE ){.   
56a0: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73     /* NOTE: Be s
56b0: 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b  ure to update mk
56c0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e  opcodeh.tcl when
56d0: 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76   adding or remov
56e0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73  ing.      ** cas
56f0: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
5700: 74 63 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77  tch! */.      sw
5710: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
5720: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
5730: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
5740: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
5750: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
5760: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
5770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c            /* fal
5780: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
5790: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
57a0: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
57b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
57c0: 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20  Savepoint: {.   
57d0: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
57e0: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
57f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5800: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
5810: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
5820: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
5830: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
5840: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5850: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63  acuum:.        c
5860: 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  ase OP_JournalMo
5870: 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  de: {.          
5880: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
5890: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49  .          p->bI
58a0: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
58b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
58c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
58d0: 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20  case OP_Next:.  
58e0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
58f0: 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20  rterNext: {.    
5900: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
5910: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
5920: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
5930: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
5940: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
5950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5960: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e  code generator n
5970: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f  ever codes any o
5980: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  f these opcodes 
5990: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20  as a jump.      
59a0: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65      ** to a labe
59b0: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77  l.  They are alw
59c0: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a  ays coded as a j
59d0: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f  ump backwards to
59e0: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   a .          **
59f0: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a   known address *
5a00: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
5a10: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
5a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5a30: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5a40: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
5a50: 76 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  v: {.          p
5a60: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
5a70: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
5a80: 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20  evious;.        
5a90: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5aa0: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
5ab0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
5ac0: 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65  e generator neve
5ad0: 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74  r codes any of t
5ae0: 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20  hese opcodes as 
5af0: 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20  a jump.         
5b00: 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20   ** to a label. 
5b10: 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   They are always
5b20: 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70   coded as a jump
5b30: 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20   backwards to a 
5b40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e  .          ** kn
5b50: 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  own address */. 
5b60: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
5b70: 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   pOp->p2>=0 );. 
5b80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5b90: 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65          }.#ifnde
5ba0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
5bb0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
5bc0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
5bd0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  te: {.          
5be0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
5bf0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
5c00: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
5c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5c30: 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b  se OP_VFilter: {
5c40: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
5c50: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
5c60: 72 74 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f  rt( (pOp - p->aO
5c70: 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20  p) >= 3 );.     
5c80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5c90: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
5ca0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
5cb0: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
5cc0: 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  .p1;.          i
5cd0: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
5ce0: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
5cf0: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20          /* Fall 
5d00: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65  through into the
5d10: 20 64 65 66 61 75 6c 74 20 63 61 73 65 20 2a 2f   default case */
5d20: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
5d30: 66 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  f.        defaul
5d40: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
5d50: 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  f( pOp->p2<0 ){.
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5d70: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5d80: 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20 61   script has so a
5d90: 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74  rranged things t
5da0: 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20  hat the only.   
5db0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d           ** non-
5dc0: 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73  jump opcodes les
5dd0: 73 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58  s than SQLITE_MX
5de0: 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67  _JUMP_CODE are g
5df0: 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20  uaranteed to.   
5e00: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65           ** have
5e10: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61   non-negative va
5e20: 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a  lues for P2. */.
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
5e40: 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  rt( (sqlite3Opco
5e50: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
5e60: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
5e70: 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20 20 20 20  JUMP)!=0 );.    
5e80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5e90: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 2d 70  ADDR(pOp->p2)<-p
5ea0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
5eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
5ec0: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44  ->p2 = aLabel[AD
5ed0: 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20  DR(pOp->p2)];.  
5ee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5f00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5f10: 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f     /* The mkopco
5f20: 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74 20 68  deh.tcl script h
5f30: 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64 20 74  as so arranged t
5f40: 68 69 6e 67 73 20 74 68 61 74 20 74 68 65 20 6f  hings that the o
5f50: 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 6e  nly.      ** non
5f60: 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65  -jump opcodes le
5f70: 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  ss than SQLITE_M
5f80: 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65 20  X_JUMP_CODE are 
5f90: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
5fa0: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
5fb0: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
5fc0: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
5fd0: 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65   assert( (sqlite
5fe0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
5ff0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f 50 46  pOp->opcode]&OPF
6000: 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c 20 70  LG_JUMP)==0 || p
6010: 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20 20 20  Op->p2>=0);.    
6020: 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d 3d 70  }.    if( pOp==p
6030: 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20  ->aOp ) break;. 
6040: 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20     pOp--;.  }.  
6050: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
6060: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
6070: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
6080: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
6090: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
60a0: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
60b0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
60c0: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
60d0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
60e0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
60f0: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
6100: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
6110: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
6120: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
6130: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
6140: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
6150: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
6160: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
6170: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6180: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
6190: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
61a0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
61b0: 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70  at at least N op
61c0: 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61  code slots are a
61d0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69  vailable in p wi
61e0: 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20  thout.** having 
61f0: 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f  to malloc for mo
6200: 72 65 20 73 70 61 63 65 20 28 65 78 63 65 70 74  re space (except
6210: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75   when compiled u
6220: 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  sing.** SQLITE_T
6230: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
6240: 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72  SS).  This inter
6250: 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75 72  face is used dur
6260: 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74  ing testing.** t
6270: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63 65  o verify that ce
6280: 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73  rtain calls to s
6290: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
62a0: 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a  ist() can never.
62b0: 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61  ** fail due to a
62c0: 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68   OOM fault and h
62d0: 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72 65  ence that the re
62e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a  turn value from.
62f0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
6300: 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61  dOpList() will a
6310: 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c  lways be non-NUL
6320: 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  L..*/.#if define
6330: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
6340: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6350: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
6360: 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c  STRESS).void sql
6370: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
6380: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56  MallocRequired(V
6390: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
63a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
63b0: 20 2b 20 4e 20 3c 3d 20 70 2d 3e 6e 4f 70 41 6c   + N <= p->nOpAl
63c0: 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  loc );.}.#endif.
63d0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
63e0: 61 74 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  at the VM passed
63f0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
6400: 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63  ument does not c
6410: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f  ontain.** an OP_
6420: 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
6430: 2e 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74  . Fail an assert
6440: 28 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54  () if it does. T
6450: 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62  his is used.** b
6460: 79 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61  y code in pragma
6470: 2e 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  .c to ensure tha
6480: 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  t the implementa
6490: 74 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a  tion of certain.
64a0: 2a 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f  ** pragmas compo
64b0: 72 74 73 20 77 69 74 68 20 74 68 65 20 66 6c 61  rts with the fla
64c0: 67 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  gs specified in 
64d0: 74 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e  the mkpragmatab.
64e0: 74 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a  tcl.** script..*
64f0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
6500: 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21  LITE_DEBUG) && !
6510: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
6520: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
6530: 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  SS).void sqlite3
6540: 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75  VdbeVerifyNoResu
6550: 6c 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a  ltRow(Vdbe *p){.
6560: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6570: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
6580: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
6590: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
65a0: 21 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29  !=OP_ResultRow )
65b0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
65c0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
65d0: 6f 64 65 20 28 61 20 73 69 6e 67 6c 65 20 4f 50  ode (a single OP
65e0: 5f 41 62 6f 72 74 61 62 6c 65 20 6f 70 63 6f 64  _Abortable opcod
65f0: 65 29 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20  e) that will.** 
6600: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
6610: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 63 61 6e  VDBE program can
6620: 20 73 61 66 65 6c 79 20 63 61 6c 6c 20 41 62 6f   safely call Abo
6630: 72 74 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  rt in the curren
6640: 74 0a 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f  t.** context..*/
6650: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6660: 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64 20  ITE_DEBUG).void 
6670: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
6680: 79 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20  yAbortable(Vdbe 
6690: 2a 70 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  *p, int onError)
66a0: 7b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  {.  if( onError=
66b0: 3d 4f 45 5f 41 62 6f 72 74 20 29 20 73 71 6c 69  =OE_Abort ) sqli
66c0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
66d0: 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 29 3b 0a   OP_Abortable);.
66e0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
66f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
6700: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
6710: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
6720: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
6730: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
6740: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
6750: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6760: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
6770: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
6780: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
6790: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
67a0: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
67b0: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
67c0: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
67d0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
67e0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
67f0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
6800: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
6810: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
6820: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
6830: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
6840: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
6850: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
6860: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
6870: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
6880: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
6890: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
68a0: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
68b0: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
68c0: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
68d0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
68e0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
68f0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
6900: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
6910: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
6920: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
6930: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
6940: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
6950: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
6960: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
6970: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
6980: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
6990: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
69a0: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
69b0: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
69c0: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
69d0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
69e0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
69f0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
6a00: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
6a10: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
6a20: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
6a30: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
6a40: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
6a50: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
6a60: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  ack.  Return a.*
6a70: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
6a80: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
6a90: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
6aa0: 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67   Non-zero P2 arg
6ab0: 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69  uments to jump i
6ac0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
6ad0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64  automatically ad
6ae0: 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61  justed.** so tha
6af0: 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65  t the jump targe
6b00: 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f  t is relative to
6b10: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
6b20: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
6b30: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
6b40: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a  3VdbeAddOpList(.
6b50: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6b70: 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f  * Add opcodes to
6b80: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
6b90: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
6ba0: 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   nOp,           
6bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6bc0: 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74  ber of opcodes t
6bd0: 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f  o add */.  VdbeO
6be0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
6bf0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
6c00: 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64  pcodes to be add
6c10: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  ed */.  int iLin
6c20: 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  eno             
6c30: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66       /* Source-f
6c40: 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ile line number 
6c50: 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20  of first opcode 
6c60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
6c70: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a   VdbeOp *pOut, *
6c80: 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74  pFirst;.  assert
6c90: 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ( nOp>0 );.  ass
6ca0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6cb0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6cc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
6cd0: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
6ce0: 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61  oc && growOpArra
6cf0: 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20  y(p, nOp) ){.   
6d00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6d10: 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d   pFirst = pOut =
6d20: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d   &p->aOp[p->nOp]
6d30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
6d40: 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20  Op; i++, aOp++, 
6d50: 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75  pOut++){.    pOu
6d60: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d  t->opcode = aOp-
6d70: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75  >opcode;.    pOu
6d80: 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b  t->p1 = aOp->p1;
6d90: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20  .    pOut->p2 = 
6da0: 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73  aOp->p2;.    ass
6db0: 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20  ert( aOp->p2>=0 
6dc0: 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  );.    if( (sqli
6dd0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
6de0: 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26  y[aOp->opcode] &
6df0: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
6e00: 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a  && aOp->p2>0 ){.
6e10: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b        pOut->p2 +
6e20: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  = p->nOp;.    }.
6e30: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61      pOut->p3 = a
6e40: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74  Op->p3;.    pOut
6e50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
6e60: 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d  TUSED;.    pOut-
6e70: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
6e80: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
6e90: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6ea0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
6eb0: 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  TS.    pOut->zCo
6ec0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
6ed0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
6ee0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
6ef0: 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65    pOut->iSrcLine
6f00: 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65   = iLineno+i;.#e
6f10: 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c  lse.    (void)iL
6f20: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
6f30: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6f40: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  G.    if( p->db-
6f50: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
6f60: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
6f70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6f80: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
6f90: 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b  p->nOp, &p->aOp[
6fa0: 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20  i+p->nOp]);.    
6fb0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  }.#endif.  }.  p
6fc0: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
6fd0: 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d  return pFirst;.}
6fe0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
6ff0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
7000: 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a  _SCANSTATUS)./*.
7010: 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
7020: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
7030: 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64  counters managed
7040: 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   by sqlite3_stmt
7050: 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a  _scanstatus()..*
7060: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7070: 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20  beScanStatus(.  
7080: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61  /* VM to add sca
70b0: 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a  nstatus() to */.
70c0: 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
70d0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
70e0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
70f0: 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30  OP_Explain (or 0
7100: 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c  ) */.  int addrL
7110: 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
7120: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
7130: 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  s of loop counte
7140: 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72  r */ .  int addr
7150: 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 20 20  Visit,          
7160: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
7170: 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  ss of rows visit
7180: 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ed counter */.  
7190: 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20  LogEst nEst,    
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
71c0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
71d0: 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ws */.  const ch
71e0: 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
71f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
7200: 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  of table or inde
7210: 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  x being scanned 
7220: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
7230: 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28 70  int64 nByte = (p
7240: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
7250: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
7260: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
7270: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
7280: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
7290: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
72a0: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
72b0: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
72c0: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
72d0: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
72e0: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
72f0: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
7300: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
7310: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
7320: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
7330: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
7340: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
7350: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
7360: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
7370: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
7380: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
7390: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
73a0: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
73b0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
73c0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
73d0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
73e0: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
73f0: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
7400: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
7410: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
7420: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7430: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
7440: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
7450: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
7460: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
7470: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
7480: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
7490: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
74a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
74b0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
74c0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
74d0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
74e0: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
74f0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
7500: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
7510: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
7520: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
7530: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
7540: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
7550: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
7560: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
7570: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
7580: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
7590: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
75a0: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
75b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
75c0: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
75d0: 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73  p, u16 p5){.  as
75e0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
75f0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
7600: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
7610: 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70  ->nOp>0 ) p->aOp
7620: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
7630: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  p5;.}../*.** Cha
7640: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
7650: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
7660: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
7670: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
7680: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
7690: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
76a0: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
76b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
76c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
76d0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
76e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
76f0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
7700: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
7710: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
7720: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
7730: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
7740: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
7750: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
7760: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
7770: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
7780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7790: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
77a0: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
77b0: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
77c0: 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d  f){.  if( (pDef-
77d0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
77e0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
77f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7800: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44  3DbFreeNN(db, pD
7810: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
7820: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
7830: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
7840: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
7850: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
7860: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
7870: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
7880: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
7890: 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73  void freeP4Mem(s
78a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20  qlite3 *db, Mem 
78b0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  *p){.  if( p->sz
78c0: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
78d0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
78e0: 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65  alloc);.  sqlite
78f0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
7900: 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54  ;.}.static SQLIT
7910: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
7920: 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71  freeP4FuncCtx(sq
7930: 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74  lite3 *db, sqlit
7940: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a  e3_context *p){.
7950: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
7960: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70  unction(db, p->p
7970: 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44  Func);. sqlite3D
7980: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
7990: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
79a0: 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62  eeP4(sqlite3 *db
79b0: 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f  , int p4type, vo
79c0: 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72  id *p4){.  asser
79d0: 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63  t( db );.  switc
79e0: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
79f0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
7a00: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  : {.      freeP4
7a10: 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c  FuncCtx(db, (sql
7a20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
7a30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7a40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7a50: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65  4_REAL:.    case
7a60: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63   P4_INT64:.    c
7a70: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
7a80: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42      case P4_DYNB
7a90: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34  LOB:.    case P4
7aa0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
7ab0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7ac0: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
7ad0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7ae0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
7af0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7b00: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7b10: 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 ) sqlite3KeyIn
7b20: 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f  foUnref((KeyInfo
7b30: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7b40: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
7b50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
7b60: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
7b70: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
7b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7b90: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
7ba0: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  r*)p4);.      br
7bb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7bc0: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  f.    case P4_FU
7bd0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 66  NCDEF: {.      f
7be0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
7bf0: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
7c00: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  f*)p4);.      br
7c10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7c20: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
7c30: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
7c40: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20  tesFreed==0 ){. 
7c50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
7c60: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
7c70: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
7c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7c90: 20 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c 20    freeP4Mem(db, 
7ca0: 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20  (Mem*)p4);.     
7cb0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7cc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7cd0: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
7ce0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
7cf0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
7d00: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
7d10: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
7d20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
7d40: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
7d50: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
7d60: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
7d70: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
7d80: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
7d90: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
7da0: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
7db0: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
7dc0: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
7dd0: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
7de0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
7df0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
7e00: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
7e10: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
7e20: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
7e30: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
7e40: 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f  =&aOp[nOp-1]; pO
7e50: 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a  p>=aOp; pOp--){.
7e60: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
7e70: 34 74 79 70 65 20 3c 3d 20 50 34 5f 46 52 45 45  4type <= P4_FREE
7e80: 5f 49 46 5f 4c 45 20 29 20 66 72 65 65 50 34 28  _IF_LE ) freeP4(
7e90: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
7ea0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
7eb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7ec0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
7ed0: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
7ee0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
7ef0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
7f00: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20  f     .    }.   
7f10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
7f20: 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d  (db, aOp);.  }.}
7f30: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
7f40: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
7f50: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
7f60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
7f70: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
7f80: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
7f90: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
7fa0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
7fb0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
7fc0: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
7fd0: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
7fe0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
7ff0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
8000: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
8010: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
8020: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
8030: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
8040: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
8050: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
8060: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
8070: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
8080: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
8090: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69  nto OP_Noop.*/.i
80a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
80b0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
80c0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
80d0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
80e0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
80f0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8100: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   0;.  assert( ad
8110: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
8120: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20  >nOp );.  pOp = 
8130: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
8140: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
8150: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
8160: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
8170: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
8180: 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ED;.  pOp->p4.z 
8190: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  = 0;.  pOp->opco
81a0: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
81b0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
81c0: 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f  ** If the last o
81d0: 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e  pcode is "op" an
81e0: 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75  d it is not a ju
81f0: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a  mp destination,.
8200: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69  ** then remove i
8210: 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
8220: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
8230: 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d  n opcode was rem
8240: 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
8250: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
8260: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
8270: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
8280: 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e   p->nOp>0 && p->
8290: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70  aOp[p->nOp-1].op
82a0: 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20  code==op ){.    
82b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
82c0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70  beChangeToNoop(p
82d0: 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d  , p->nOp-1);.  }
82e0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
82f0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8300: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
8310: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
8320: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
8330: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
8340: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8350: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
8360: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
8370: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
8380: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
8390: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
83a0: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
83b0: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
83c0: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
83d0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
83e0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
83f0: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
8400: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
8410: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
8420: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
8430: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
8440: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
8450: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
8460: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
8470: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
8480: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
8490: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
84a0: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
84b0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
84c0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
84d0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
84e0: 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f  of zP4..** .** O
84f0: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
8500: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
8510: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
8520: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
8530: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
8540: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
8550: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
8560: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
8570: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
8580: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
8590: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
85a0: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
85b0: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
85c0: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
85d0: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
85e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
85f0: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
8600: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
8610: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49   void SQLITE_NOI
8620: 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67 65  NLINE vdbeChange
8630: 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a  P4Full(.  Vdbe *
8640: 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20  p,.  Op *pOp,.  
8650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
8660: 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66  .  int n.){.  if
8670: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
8680: 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64  .    freeP4(p->d
8690: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
86a0: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
86b0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b  pOp->p4type = 0;
86c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
86d0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c   0;.  }.  if( n<
86e0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
86f0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
8700: 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61  (int)(pOp - p->a
8710: 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  Op), zP4, n);.  
8720: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
8730: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
8740: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
8750: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
8760: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8770: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
8780: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
8790: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
87a0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
87b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
87c0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
87d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
87e0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
87f0: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
8800: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
8810: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
8820: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
8830: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
8840: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
8850: 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c  ert( p->aOp!=0 |
8860: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
8870: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
8880: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
8890: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54      if( n!=P4_VT
88a0: 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  AB ) freeP4(db, 
88b0: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
88c0: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72 65  **)&zP4);.    re
88d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
88e0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
88f0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
8900: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
8910: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
8920: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
8930: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
8940: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
8950: 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34   n>=0 || pOp->p4
8960: 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62 65  type ){.    vdbe
8970: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20  ChangeP4Full(p, 
8980: 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  pOp, zP4, n);.  
8990: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
89a0: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
89b0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
89c0: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
89d0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
89e0: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
89f0: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
8a00: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
8a10: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
8a20: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
8a30: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
8a40: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
8a50: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
8a60: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
8a70: 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30 20  else if( zP4!=0 
8a80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
8a90: 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 );.    pOp->p
8aa0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
8ab0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
8ac0: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
8ad0: 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50  )n;.    if( n==P
8ae0: 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65 33  4_VTAB ) sqlite3
8af0: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
8b00: 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  *)zP4);.  }.}../
8b10: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
8b20: 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P4 operand of th
8b30: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8b40: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
8b50: 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c  n .** to the val
8b60: 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ue defined by th
8b70: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
8b80: 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70 65  is is a high-spe
8b90: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
8ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8bb0: 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  geP4()..**.** Th
8bc0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75 73  e P4 operand mus
8bd0: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
8be0: 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69 6e  previously defin
8bf0: 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65 77  ed.  And the new
8c00: 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74 20  .** P4 must not 
8c10: 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55 73  be P4_INT32.  Us
8c20: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
8c30: 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68 65  ngeP4() in eithe
8c40: 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61  r of.** those ca
8c50: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
8c60: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
8c70: 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a  (Vdbe *p, void *
8c80: 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56  pP4, int n){.  V
8c90: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  dbeOp *pOp;.  as
8ca0: 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33  sert( n!=P4_INT3
8cb0: 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20  2 && n!=P4_VTAB 
8cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d  );.  assert( n<=
8cd0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  0 );.  if( p->db
8ce0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8cf0: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
8d00: 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d  db, n, pP4);.  }
8d10: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
8d20: 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20 20  ( pP4!=0 );.    
8d30: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
8d40: 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 70   );.    pOp = &p
8d50: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
8d60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
8d70: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
8d80: 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d  USED );.    pOp-
8d90: 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20  >p4type = n;.   
8da0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34   pOp->p4.p = pP4
8db0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8dc0: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
8dd0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8de0: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
8df0: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
8e00: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
8e10: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8e20: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
8e30: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
8e40: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
8e50: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
8e60: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79  se->pVdbe;.  Key
8e70: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
8e80: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
8e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
8ea0: 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66  !=0 );.  pKeyInf
8eb0: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
8ec0: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
8ed0: 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20 70  , pIdx);.  if( p
8ee0: 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74 65  KeyInfo ) sqlite
8ef0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
8f00: 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45   pKeyInfo, P4_KE
8f10: 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65  YINFO);.}..#ifde
8f20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8f30: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
8f40: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
8f50: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
8f60: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
8f70: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
8f80: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
8f90: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
8fa0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
8fb0: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
8fc0: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
8fd0: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
8fe0: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
8ff0: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
9000: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
9010: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
9020: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
9030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
9040: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
9050: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
9060: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
9070: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
9080: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
9090: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
90a0: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
90b0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
90c0: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
90d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
90e0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
90f0: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
9100: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
9110: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
9120: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
9130: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
9140: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
9150: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
9160: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
9170: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
9180: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
9190: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
91a0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
91b0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
91c0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
91d0: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
91e0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
91f0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
9200: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
9210: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
9220: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
9230: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
9240: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
9250: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
9260: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
9270: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
9280: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
9290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
92a0: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
92b0: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
92c0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
92d0: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
92e0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
92f0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
9300: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
9310: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
9320: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
9330: 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  RAGE./*.** Set t
9340: 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  he value if the 
9350: 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66  iSrcLine field f
9360: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  or the previousl
9370: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
9380: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9390: 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e  ite3VdbeSetLineN
93a0: 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69  umber(Vdbe *v, i
93b0: 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c  nt iLine){.  sql
93c0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
93d0: 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  -1)->iSrcLine = 
93e0: 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  iLine;.}.#endif 
93f0: 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  /* SQLITE_VDBE_C
9400: 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a  OVERAGE */../*.*
9410: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
9420: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
9430: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
9440: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
9450: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
9460: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9470: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
9480: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
9490: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
94a0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
94b0: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
94c0: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
94d0: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
94e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
94f0: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
9500: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
9510: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
9520: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
9530: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
9540: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
9550: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
9560: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
9570: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
9580: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
9590: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
95a0: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
95b0: 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74  ter an OOM fault
95c0: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
95d0: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
95e0: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
95f0: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
9600: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
9610: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
9620: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
9630: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
9640: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
9650: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
9660: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
9670: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
9680: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
9690: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
96a0: 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ind..*/.VdbeOp *
96b0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
96c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
96d0: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
96e0: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
96f0: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
9700: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
9710: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
9720: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
9730: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
9740: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
9750: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
9760: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
9770: 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f  VdbeOp dummy;  /
9780: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56  * Ignore the MSV
9790: 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  C warning about 
97a0: 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  no initializer *
97b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  /.  assert( p->m
97c0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
97d0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61  _INIT );.  if( a
97e0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
97f0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
9800: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
9810: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
9820: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
9830: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9840: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
9850: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9860: 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70    return (VdbeOp
9870: 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  *)&dummy;.  }els
9880: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
9890: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
98a0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
98b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
98c0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a  PLAIN_COMMENTS).
98d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
98e0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
98f0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72  r one of the par
9900: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ameters to the o
9910: 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74  pcode pOp.** det
9920: 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61  ermined by chara
9930: 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69  cter c..*/.stati
9940: 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50  c int translateP
9950: 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f  (char c, const O
9960: 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63  p *pOp){.  if( c
9970: 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 70  =='1' ) return p
9980: 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d  Op->p1;.  if( c=
9990: 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='2' ) return pO
99a0: 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p2;.  if( c==
99b0: 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '3' ) return pOp
99c0: 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p3;.  if( c=='
99d0: 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  4' ) return pOp-
99e0: 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  >p4.i;.  return 
99f0: 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  pOp->p5;.}../*.*
9a00: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
9a10: 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d  ng for the "comm
9a20: 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20  ent" field of a 
9a30: 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74  VDBE opcode list
9a40: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ing..**.** The S
9a50: 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69  ynopsis: field i
9a60: 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  n comments in th
9a70: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
9a80: 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72  file gets conver
9a90: 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74  ted.** to an ext
9aa0: 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69  ra string that i
9ab0: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
9ac0: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
9ad0: 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a  ame().  In the.*
9ae0: 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68  * absence of oth
9af0: 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69  er comments, thi
9b00: 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d  s synopsis becom
9b10: 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  es the comment o
9b20: 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a  n the opcode..**
9b30: 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f   Some translatio
9b40: 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20  n occurs:.**.** 
9b50: 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20 20        "PX"      
9b60: 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20  ->  "r[X]".**   
9b70: 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e      "PX@PY"   ->
9b80: 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20    "r[X..X+Y-1]" 
9b90: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
9ba0: 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20  is 0 or 1.**    
9bb0: 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20     "PX@PY+1" -> 
9bc0: 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20   "r[X..X+Y]"    
9bd0: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69  or "r[x]" if y i
9be0: 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59  s 0.**       "PY
9bf0: 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e  ..PY"  ->  "r[X.
9c00: 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b  .Y]"      or "r[
9c10: 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73  x]" if y<=x.*/.s
9c20: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
9c30: 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73  yComment(.  cons
9c40: 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f  t Op *pOp,     /
9c50: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  * The opcode to 
9c60: 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a  be commented */.
9c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9c80: 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  4,   /* Previous
9c90: 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75  ly obtained valu
9ca0: 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68  e for P4 */.  ch
9cb0: 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20  ar *zTemp,      
9cc0: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
9cd0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
9ce0: 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a  Temp          /*
9cf0: 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
9d00: 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29   in zTemp[] */.)
9d10: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
9d20: 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  zOpName;.  const
9d30: 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73   char *zSynopsis
9d40: 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b  ;.  int nOpName;
9d50: 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20  .  int ii, jj;. 
9d60: 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a   char zAlt[50];.
9d70: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
9d80: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
9d90: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
9da0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
9db0: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
9dc0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
9dd0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
9de0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
9df0: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
9e00: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
9e10: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
9e20: 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73  e + 1;.    if( s
9e30: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
9e40: 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"IF ",3)==0 ){.
9e50: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
9e60: 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  5 & SQLITE_STORE
9e70: 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  P2 ){.        sq
9e80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
9e90: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c  izeof(zAlt), zAl
9ea0: 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29  t, "r[P2] = (%s)
9eb0: 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b  ", zSynopsis+3);
9ec0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9ee0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
9ef0: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25  lt), zAlt, "if %
9f00: 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e  s goto P2", zSyn
9f10: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9f20: 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69  }.      zSynopsi
9f30: 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a  s = zAlt;.    }.
9f40: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
9f50: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
9f60: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
9f70: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
9f80: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
9f90: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
9fa0: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
9fb0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
9fc0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9fd0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9fe0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9ff0: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
a000: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
a010: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
a020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
a030: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
a040: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
a050: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
a060: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
a070: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
a080: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a090: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
a0a0: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
a0b0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
a0c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a0d0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
a0e0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
a0f0: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
a100: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
a110: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
a120: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
a130: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
a140: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
a150: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
a160: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
a170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
a180: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
a190: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
a1a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
a1b0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
a1c0: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
a1d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a1e0: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
a200: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
a210: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
a220: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
a230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
a240: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
a250: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
a260: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
a270: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a280: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
a290: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
a2a0: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
a2b0: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
a2c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a2d0: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
a2e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a2f0: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
a300: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
a310: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
a320: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
a330: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
a340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a350: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
a360: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
a370: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
a380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a390: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
a3a0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
a3b0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
a3c0: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
a3d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a3e0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
a3f0: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
a400: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
a410: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
a420: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
a430: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a440: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
a450: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
a460: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
a470: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a480: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
a490: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
a4a0: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
a4b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
a4c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
a4d0: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23  LITE_DEBUG */..#
a4e0: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
a4f0: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
a500: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
a510: 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  OR_HINTS)./*.** 
a520: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34  Translate the P4
a530: 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72  .pExpr value for
a540: 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e   an OP_CursorHin
a550: 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65  t opcode into te
a560: 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  xt.** that can b
a570: 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74  e displayed in t
a580: 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20  he P4 column of 
a590: 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a  EXPLAIN output..
a5a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
a5b0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74 72  isplayP4Expr(Str
a5c0: 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a  Accum *p, Expr *
a5d0: 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20  pExpr){.  const 
a5e0: 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20  char *zOp = 0;. 
a5f0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
a600: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a610: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  K_STRING:.      
a620: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a630: 6e 64 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78  ndf(p, "%Q", pEx
a640: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
a650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a660: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
a670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a680: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
a690: 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  d", pExpr->u.iVa
a6a0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
a6b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
a6c0: 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ULL:.      sqlit
a6d0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
a6e0: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
a6f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a700: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
a710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a720: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 5b  r_appendf(p, "r[
a730: 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d]", pExpr->iTa
a740: 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
a750: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a760: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
a770: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
a780: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
a790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a7a0: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 6f 77  _appendf(p, "row
a7b0: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
a7c0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
a7d0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
a7e0: 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45  , "c%d", (int)pE
a7f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
a800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a810: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a820: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
a830: 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20  Op = "LT";      
a840: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a850: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_LE:      zOp 
a860: 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65  = "LE";      bre
a870: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a880: 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GT:      zOp = "
a890: 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GT";      break;
a8a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
a8b0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22        zOp = "GE"
a8c0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a8d0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
a8e0: 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20     zOp = "NE";  
a8f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a900: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
a910: 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  zOp = "EQ";     
a920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a930: 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70   TK_IS:      zOp
a940: 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72   = "IS";      br
a950: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a960: 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20  _ISNOT:   zOp = 
a970: 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b  "ISNOT";   break
a980: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
a990: 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e  D:     zOp = "AN
a9a0: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  D";     break;. 
a9b0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
a9c0: 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20      zOp = "OR"; 
a9d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a9e0: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
a9f0: 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20   zOp = "ADD";   
aa00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aa10: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f  e TK_STAR:    zO
aa20: 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62  p = "MUL";     b
aa30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aa40: 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d  K_MINUS:   zOp =
aa50: 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61   "SUB";     brea
aa60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
aa70: 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52  EM:     zOp = "R
aa80: 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EM";     break;.
aa90: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
aaa0: 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41  ND:  zOp = "BITA
aab0: 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ND";  break;.   
aac0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
aad0: 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b    zOp = "BITOR";
aae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
aaf0: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
ab00: 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20  Op = "DIV";     
ab10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ab20: 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_LSHIFT:  zOp 
ab30: 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65  = "LSHIFT";  bre
ab40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ab50: 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22  RSHIFT:  zOp = "
ab60: 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b  RSHIFT";  break;
ab70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
ab80: 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e  CAT:  zOp = "CON
ab90: 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  CAT";  break;.  
aba0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
abb0: 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22  :  zOp = "MINUS"
abc0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
abd0: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
abe0: 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20  zOp = "PLUS";   
abf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ac00: 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70   TK_BITNOT:  zOp
ac10: 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72   = "BITNOT";  br
ac20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
ac30: 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _NOT:     zOp = 
ac40: 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  "NOT";     break
ac50: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
ac60: 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53  NULL:  zOp = "IS
ac70: 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NULL";  break;. 
ac80: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
ac90: 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55  LL: zOp = "NOTNU
aca0: 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
acb0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
acc0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
acd0: 6e 64 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78  ndf(p, "%s", "ex
ace0: 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pr");.      brea
acf0: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f  k;.  }..  if( zO
ad00: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
ad10: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
ad20: 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20  "%s(", zOp);.   
ad30: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
ad40: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
ad50: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
ad60: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
ad70: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
ad80: 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20  nd(p, ",", 1);. 
ad90: 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78       displayP4Ex
ada0: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69  pr(p, pExpr->pRi
adb0: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
adc0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
add0: 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20  nd(p, ")", 1);. 
ade0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56   }.}.#endif /* V
adf0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
ae00: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ae10: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
ae20: 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56  INTS) */...#if V
ae30: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f  DBE_DISPLAY_P4./
ae40: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
ae50: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
ae60: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
ae70: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
ae80: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
ae90: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
aea0: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
aeb0: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
aec0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
aed0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
aee0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
aef0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
af00: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74  P4 = zTemp;.  St
af10: 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65  rAccum x;.  asse
af20: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
af30: 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
af40: 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54  umInit(&x, 0, zT
af50: 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a  emp, nTemp, 0);.
af60: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
af70: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
af80: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
af90: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
afa0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
afb0: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
afc0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  KeyInfo;.      a
afd0: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
afe0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
aff0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b000: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b010: 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  "k(%d", pKeyInfo
b020: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a 20 20  ->nKeyField);.  
b030: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
b040: 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
b050: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
b060: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
b070: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
b080: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
b090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
b0a0: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
b0b0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  ->zName : "";.  
b0c0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
b0d0: 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22  (zColl, "BINARY"
b0e0: 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  )==0 ) zColl = "
b0f0: 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  B";.        sqli
b100: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b110: 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 0a 20 20  &x, ",%s%s", .  
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
b130: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
b140: 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c  r[j] ? "-" : "",
b150: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d   zColl);.      }
b160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b170: 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 29  tr_append(&x, ")
b180: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
b190: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
b1a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
b1b0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
b1c0: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
b1d0: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
b1e0: 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e  xpr(&x, pOp->p4.
b1f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  pExpr);.      br
b200: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b210: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  f.    case P4_CO
b220: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
b230: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
b240: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
b250: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b260: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 28 25  _appendf(&x, "(%
b270: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
b280: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
b290: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b2a0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
b2b0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
b2c0: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
b2d0: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
b2e0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b2f0: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
b300: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
b310: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
b320: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64  eak;.    }.#if d
b330: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
b340: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
b350: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
b360: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
b370: 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  X: {.      FuncD
b380: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
b390: 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a  p4.pCtx->pFunc;.
b3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b3b0: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b3c0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
b3d0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
b3e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b3f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
b400: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
b410: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b420: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b430: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
b440: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
b450: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b460: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
b470: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b480: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 64  _appendf(&x, "%d
b490: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
b4a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b4b0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
b4c0: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
b4d0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b4e0: 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  &x, "%.16g", *pO
b4f0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
b500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b510: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
b520: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
b530: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
b540: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
b550: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
b560: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
b570: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
b580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
b590: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  em->flags & (MEM
b5a0: 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  _Int|MEM_IntReal
b5b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
b5c0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b5d0: 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  (&x, "%lld", pMe
b5e0: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
b5f0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
b600: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
b610: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b620: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b630: 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  x, "%.16g", pMem
b640: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
b650: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
b660: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
b670: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
b680: 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65  "NULL";.      }e
b690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
b6a0: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ert( pMem->flags
b6b0: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
b6c0: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62         zP4 = "(b
b6d0: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  lob)";.      }. 
b6e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b6f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
b700: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
b710: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
b720: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
b730: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
b740: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
b750: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73  ->pVtab;.      s
b760: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b770: 64 66 28 26 78 2c 20 22 76 74 61 62 3a 25 70 22  df(&x, "vtab:%p"
b780: 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20  , pVtab);.      
b790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b7a0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
b7b0: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
b7c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
b7d0: 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34  nt *ai = pOp->p4
b7e0: 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  .ai;.      int n
b7f0: 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54   = ai[0];   /* T
b800: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
b810: 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41 59 20   of an INTARRAY 
b820: 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a 20 20  is always the.  
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66       ** count of
b850: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
b860: 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f  lements to follo
b870: 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  w */.      for(i
b880: 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a  =1; i<=n; i++){.
b890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b8a0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b8b0: 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20  ",%d", ai[i]);. 
b8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
b8d0: 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20  mp[0] = '[';.   
b8e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b8f0: 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31  ppend(&x, "]", 1
b900: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b910: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
b920: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
b930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b940: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 70  r_appendf(&x, "p
b950: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
b960: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b970: 20 63 61 73 65 20 50 34 5f 44 59 4e 42 4c 4f 42   case P4_DYNBLOB
b980: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44  :.    case P4_AD
b990: 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a  VANCE: {.      z
b9a0: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
b9b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b9c0: 20 20 20 20 63 61 73 65 20 50 34 5f 54 41 42 4c      case P4_TABL
b9d0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
b9e0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b9f0: 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  x, "%s", pOp->p4
ba00: 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  .pTab->zName);. 
ba10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ba20: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
ba30: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
ba40: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
ba50: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
ba60: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
ba70: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
ba80: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
ba90: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
baa0: 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
bab0: 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (&x);.  assert( 
bac0: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
bad0: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
bae0: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
baf0: 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  _P4 */../*.** De
bb00: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
bb10: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
bb20: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
bb30: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
bb40: 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65  *.** The prepare
bb50: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65  d statements nee
bb60: 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76  d to know in adv
bb70: 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  ance the complet
bb80: 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61  e set of.** atta
bb90: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
bba0: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e  hat will be use.
bbb0: 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73    A mask of thes
bbc0: 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69  e databases.** i
bbd0: 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20  s maintained in 
bbe0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54  p->btreeMask.  T
bbf0: 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76  he p->lockMask v
bc00: 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62 73  alue is the subs
bc10: 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65  et of.** p->btre
bc20: 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73  eMask of databas
bc30: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71  es that will req
bc40: 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a  uire a lock..*/.
bc50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
bc60: 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a  UsesBtree(Vdbe *
bc70: 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73  p, int i){.  ass
bc80: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
bc90: 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28  ->db->nDb && i<(
bca0: 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61  int)sizeof(yDbMa
bcb0: 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72  sk)*8 );.  asser
bcc0: 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  t( i<(int)sizeof
bcd0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38  (p->btreeMask)*8
bce0: 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28   );.  DbMaskSet(
bcf0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29  p->btreeMask, i)
bd00: 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20  ;.  if( i!=1 && 
bd10: 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
bd20: 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b  able(p->db->aDb[
bd30: 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44  i].pBt) ){.    D
bd40: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b  bMaskSet(p->lock
bd50: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  Mask, i);.  }.}.
bd60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
bd70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
bd80: 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66  _CACHE)./*.** If
bd90: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
bda0: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
bdb0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
bdc0: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
bdd0: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
bde0: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
bdf0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
be00: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
be10: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
be20: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
be30: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
be40: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
be50: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
be60: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
be70: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
be80: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
be90: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
bea0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
beb0: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
bec0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
bed0: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
bee0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
bef0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
bf00: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
bf10: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
bf20: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
bf30: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
bf40: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
bf50: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
bf60: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
bf70: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
bf80: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
bf90: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
bfa0: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
bfb0: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
bfc0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
bfd0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
bfe0: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
bff0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
c000: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
c010: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
c020: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
c030: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
c040: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
c050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
c060: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
c070: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
c080: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
c090: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
c0a0: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
c0b0: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
c0c0: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
c0d0: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
c0e0: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
c0f0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
c100: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
c110: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
c120: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
c130: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
c140: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
c150: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
c160: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
c170: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
c180: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
c190: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
c1a0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
c1b0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
c1c0: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
c1d0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44  int nDb;.  if( D
c1e0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
c1f0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75  lockMask) ) retu
c200: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
c210: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
c220: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
c230: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
c240: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
c250: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
c260: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
c270: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
c280: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
c290: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
c2a0: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
c2b0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c2c0: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
c2d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
c2e0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
c2f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
c300: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
c310: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
c320: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c  /*.** Unlock all
c330: 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70   of the btrees p
c340: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64  reviously locked
c350: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   by a call to sq
c360: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29  lite3VdbeEnter()
c370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
c380: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
c390: 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20   vdbeLeave(Vdbe 
c3a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
c3b0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
c3c0: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
c3d0: 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
c3e0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
c3f0: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
c400: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
c410: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
c420: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
c430: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
c440: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
c450: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
c460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
c470: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
c480: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
c490: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
c4a0: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
c4b0: 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  {.  if( DbMaskAl
c4c0: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
c4d0: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
c4e0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
c4f0: 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28   */.  vdbeLeave(
c500: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  p);.}.#endif..#i
c510: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
c520: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
c530: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
c540: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
c550: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
c560: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
c570: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
c580: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
c590: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
c5a0: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
c5b0: 6e 74 20 70 63 2c 20 56 64 62 65 4f 70 20 2a 70  nt pc, VdbeOp *p
c5c0: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
c5d0: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
c5e0: 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31  ];.  char zCom[1
c5f0: 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  00];.  static co
c600: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
c610: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
c620: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33  %4d %4d %4d %-13
c630: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
c640: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
c650: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
c660: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
c670: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
c680: 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20  (zPtr));.#ifdef 
c690: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
c6a0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
c6b0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
c6c0: 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20  pOp, zP4, zCom, 
c6d0: 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23  sizeof(zCom));.#
c6e0: 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d  else.  zCom[0] =
c6f0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   0;.#endif.  /* 
c700: 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33  NB:  The sqlite3
c710: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e  OpcodeName() fun
c720: 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
c730: 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65  nted by code cre
c740: 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  ated.  ** by the
c750: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61   mkopcodeh.awk a
c760: 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b  nd mkopcodec.awk
c770: 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65   scripts which e
c780: 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20  xtract the.  ** 
c790: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
c7a0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
c7b0: 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72  ce text */.  fpr
c7c0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
c7d0: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
c7e0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
c7f0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
c800: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
c810: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
c820: 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a  pOp->p5,.      z
c830: 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73  Com.  );.  fflus
c840: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
c850: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
c860: 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ize an array of 
c870: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a  N Mem element..*
c880: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
c890: 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  itMemArray(Mem *
c8a0: 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65  p, int N, sqlite
c8b0: 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67 73  3 *db, u16 flags
c8c0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d  ){.  while( (N--
c8d0: 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62  )>0 ){.    p->db
c8e0: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c   = db;.    p->fl
c8f0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
c900: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
c910: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c920: 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53 63  DEBUG.    p->pSc
c930: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e  opyFrom = 0;.#en
c940: 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d  dif.    p++;.  }
c950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
c960: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
c970: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
c980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
c990: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
c9a0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
c9b0: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
c9c0: 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e  Mem *pEnd = &p[N
c9d0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
c9e0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
c9f0: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
ca00: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f  reed ){.      do
ca10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
ca20: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
ca30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ca40: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
ca50: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
ca60: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  End );.      ret
ca70: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
ca80: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
ca90: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
caa0: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
cab0: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db );.      asse
cac0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
cad0: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
cae0: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  s(p) );..      /
caf0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
cb00: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
cb10: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
cb20: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
cb30: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
cb40: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
cb50: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
cb60: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
cb70: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
cb80: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
cb90: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
cba0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
cbb0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
cbc0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
cbd0: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
cbe0: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
cbf0: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
cc00: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
cc10: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
cc20: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
cc30: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
cc40: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
cc50: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
cc60: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
cc70: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
cc80: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
cc90: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
cca0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
ccb0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
ccc0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
ccd0: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
cce0: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
ccf0: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
cd00: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
cd10: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
cd20: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
cd30: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
cd40: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
cd50: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
cd60: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
cd70: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
cd80: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
cd90: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
cda0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
cdb0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
cdc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
cdd0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
cde0: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Agg );.      tes
cdf0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
ce00: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20  & MEM_Dyn );.   
ce10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
ce20: 78 44 65 6c 3d 3d 73 71 6c 69 74 65 33 56 64 62  xDel==sqlite3Vdb
ce30: 65 46 72 61 6d 65 4d 65 6d 44 65 6c 20 29 3b 0a  eFrameMemDel );.
ce40: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
ce50: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
ce60: 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dyn) ){.        
ce70: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
ce80: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
ce90: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
cea0: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
ceb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
cec0: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
ced0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d  ;.        p->szM
cee0: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
cef0: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
cf00: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
cf10: 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ed;.    }while( 
cf20: 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20  (++p)<pEnd );.  
cf30: 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  }.}..#ifdef SQLI
cf40: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 56  TE_DEBUG./*.** V
cf50: 65 72 69 66 79 20 74 68 61 74 20 70 46 72 61 6d  erify that pFram
cf60: 65 20 69 73 20 61 20 76 61 6c 69 64 20 56 64 62  e is a valid Vdb
cf70: 65 46 72 61 6d 65 20 70 6f 69 6e 74 65 72 2e 20  eFrame pointer. 
cf80: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
cf90: 69 74 20 69 73 0a 2a 2a 20 61 6e 64 20 66 61 6c  it is.** and fal
cfa0: 73 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  se if something 
cfb0: 69 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  is wrong..**.** 
cfc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cfd0: 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65  intended for use
cfe0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
cff0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  t() statements o
d000: 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nly..*/.int sqli
d010: 74 65 33 56 64 62 65 46 72 61 6d 65 49 73 56 61  te3VdbeFrameIsVa
d020: 6c 69 64 28 56 64 62 65 46 72 61 6d 65 20 2a 70  lid(VdbeFrame *p
d030: 46 72 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 46  Frame){.  if( pF
d040: 72 61 6d 65 2d 3e 69 46 72 61 6d 65 4d 61 67 69  rame->iFrameMagi
d050: 63 21 3d 53 51 4c 49 54 45 5f 46 52 41 4d 45 5f  c!=SQLITE_FRAME_
d060: 4d 41 47 49 43 20 29 20 72 65 74 75 72 6e 20 30  MAGIC ) return 0
d070: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
d080: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
d090: 68 69 73 20 69 73 20 61 20 64 65 73 74 72 75 63  his is a destruc
d0a0: 74 6f 72 20 6f 6e 20 61 20 4d 65 6d 20 6f 62 6a  tor on a Mem obj
d0b0: 65 63 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ect (which is re
d0c0: 61 6c 6c 79 20 61 6e 20 73 71 6c 69 74 65 33 5f  ally an sqlite3_
d0d0: 76 61 6c 75 65 29 0a 2a 2a 20 74 68 61 74 20 64  value).** that d
d0e0: 65 6c 65 74 65 73 20 74 68 65 20 46 72 61 6d 65  eletes the Frame
d0f0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
d100: 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 20 61  attached to it a
d110: 73 20 61 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20  s a blob..**.** 
d120: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
d130: 73 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  s not delete the
d140: 20 46 72 61 6d 65 20 72 69 67 68 74 20 61 77 61   Frame right awa
d150: 79 2e 20 20 49 74 20 6d 65 72 65 6c 79 20 61 64  y.  It merely ad
d160: 64 73 20 74 68 65 0a 2a 2a 20 66 72 61 6d 65 20  ds the.** frame 
d170: 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 66 72 61  to a list of fra
d180: 6d 65 73 20 74 6f 20 62 65 20 64 65 6c 65 74 65  mes to be delete
d190: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
d1a0: 68 61 6c 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  halts..*/.void s
d1b0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 4d  qlite3VdbeFrameM
d1c0: 65 6d 44 65 6c 28 76 6f 69 64 20 2a 70 41 72 67  emDel(void *pArg
d1d0: 29 7b 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a  ){.  VdbeFrame *
d1e0: 70 46 72 61 6d 65 20 3d 20 28 56 64 62 65 46 72  pFrame = (VdbeFr
d1f0: 61 6d 65 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  ame*)pArg;.  ass
d200: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
d210: 46 72 61 6d 65 49 73 56 61 6c 69 64 28 70 46 72  FrameIsValid(pFr
d220: 61 6d 65 29 20 29 3b 0a 20 20 70 46 72 61 6d 65  ame) );.  pFrame
d230: 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 46 72 61  ->pParent = pFra
d240: 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65  me->v->pDelFrame
d250: 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70  ;.  pFrame->v->p
d260: 44 65 6c 46 72 61 6d 65 20 3d 20 70 46 72 61 6d  DelFrame = pFram
d270: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  e;.}.../*.** Del
d280: 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20  ete a VdbeFrame 
d290: 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63  object and its c
d2a0: 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61  ontents. VdbeFra
d2b0: 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a  me objects are.*
d2c0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
d2d0: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  he OP_Program op
d2e0: 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56  code in sqlite3V
d2f0: 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f  dbeExec()..*/.vo
d300: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
d310: 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72  ameDelete(VdbeFr
d320: 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ame *p){.  int i
d330: 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  ;.  Mem *aMem = 
d340: 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b  VdbeFrameMem(p);
d350: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  .  VdbeCursor **
d360: 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
d370: 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
d380: 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 61 73  nChildMem];.  as
d390: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
d3a0: 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 70 29  eFrameIsValid(p)
d3b0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
d3c0: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
d3d0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d3e0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
d3f0: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
d400: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
d410: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
d420: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
d430: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
d440: 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20  xData(p->v->db, 
d450: 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &p->pAuxData, -1
d460: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , 0);.  sqlite3D
d470: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
d480: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
d490: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
d4a0: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
d4b0: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
d4c0: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
d4d0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
d4e0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
d4f0: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
d500: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
d510: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
d520: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
d530: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
d540: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
d550: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
d560: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
d570: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
d580: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
d590: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
d5a0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
d5b0: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
d5c0: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
d5d0: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
d5e0: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
d5f0: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
d600: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
d610: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
d620: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
d630: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
d640: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
d650: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
d660: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
d670: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 20 32  QUERY PLAN..** 2
d680: 30 31 38 2d 30 34 2d 32 34 3a 20 20 49 6e 20 70  018-04-24:  In p
d690: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 6d 6f 64  ->explain==2 mod
d6a0: 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f  e, the OP_Init o
d6b0: 70 63 6f 64 65 73 20 6f 66 20 74 72 69 67 67 65  pcodes of trigge
d6c0: 72 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 73  rs.** are also s
d6d0: 68 6f 77 6e 2c 20 73 6f 20 74 68 61 74 20 74 68  hown, so that th
d6e0: 65 20 62 6f 75 6e 64 61 72 69 65 73 20 62 65 74  e boundaries bet
d6f0: 77 65 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  ween the main pr
d700: 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a 20 65 61 63  ogram and.** eac
d710: 68 20 74 72 69 67 67 65 72 20 61 72 65 20 63 6c  h trigger are cl
d720: 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ear..**.** When 
d730: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66  p->explain==1, f
d740: 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72  irst the main pr
d750: 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c  ogram is listed,
d760: 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a   then each of.**
d770: 20 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62   the trigger sub
d780: 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73  programs are lis
d790: 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ted one by one..
d7a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
d7b0: 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  beList(.  Vdbe *
d7c0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
d7d0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
d7e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77  */.){.  int nRow
d7f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d810: 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f  Stop when row co
d820: 75 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73  unt reaches this
d830: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d   */.  int nSub =
d840: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d860: 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65  mber of sub-vdbe
d870: 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  s seen so far */
d880: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
d890: 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  apSub = 0;      
d8a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
d8b0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f   of sub-vdbes */
d8c0: 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30  .  Mem *pSub = 0
d8d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d8e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
d8f0: 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61  y cell hold arra
d900: 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f  y of subprogs */
d910: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d920: 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20   p->db;         
d930: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
d940: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d950: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  on */.  int i;  
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d980: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
d990: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d9a0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
d9b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d9c0: 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a   code */.  Mem *
d9d0: 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
d9e0: 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
d9f0: 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20  /* First Mem of 
da00: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
da10: 69 6e 74 20 62 4c 69 73 74 53 75 62 70 72 6f 67  int bListSubprog
da20: 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61 69 6e 3d  s = (p->explain=
da30: 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73  =1 || (db->flags
da40: 20 26 20 53 51 4c 49 54 45 5f 54 72 69 67 67 65   & SQLITE_Trigge
da50: 72 45 51 50 29 21 3d 30 29 3b 0a 20 20 4f 70 20  rEQP)!=0);.  Op 
da60: 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73  *pOp = 0;..  ass
da70: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
da80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
da90: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
daa0: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
dab0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
dac0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
dad0: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
dae0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
daf0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
db00: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
db10: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
db20: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
db30: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
db40: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
db50: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
db60: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
db70: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
db80: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
db90: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
dba0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
dbb0: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
dbc0: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
dbd0: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
dbe0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
dbf0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
dc00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
dc10: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
dc20: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
dc30: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
dc40: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
dc50: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
dc60: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
dc70: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
dc80: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73  ailed.  */.    s
dc90: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
dca0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
dcb0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
dcc0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
dcd0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
dce0: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
dcf0: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
dd00: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
dd10: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
dd20: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
dd30: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
dd40: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
dd50: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
dd60: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
dd70: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
dd80: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
dd90: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
dda0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
ddb0: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
ddc0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
ddd0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
dde0: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
ddf0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
de00: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
de10: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
de20: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
de30: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
de40: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
de50: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
de60: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
de70: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 62 4c  p->nOp;.  if( bL
de80: 69 73 74 53 75 62 70 72 6f 67 73 20 29 7b 0a 20  istSubprogs ){. 
de90: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
dea0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
deb0: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
dec0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
ded0: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
dee0: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
def0: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
df00: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
df10: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
df20: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
df30: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
df40: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
df50: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
df60: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
df70: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
df80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
df90: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
dfa0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
dfb0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
dfc0: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
dfd0: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
dfe0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
dff0: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
e000: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
e010: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
e020: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
e030: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
e040: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
e050: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
e060: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
e070: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
e080: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
e090: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
e0a0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
e0b0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
e0c0: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
e0d0: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
e0e0: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
e0f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68  .    }.  }..  wh
e100: 69 6c 65 28 31 29 7b 20 20 2f 2a 20 4c 6f 6f 70  ile(1){  /* Loop
e110: 20 65 78 69 74 73 20 76 69 61 20 62 72 65 61 6b   exits via break
e120: 20 2a 2f 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70   */.    i = p->p
e130: 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  c++;.    if( i>=
e140: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  nRow ){.      p-
e150: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
e160: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e170: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 62  TE_DONE;.      b
e180: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e190: 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a  if( i<p->nOp ){.
e1a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74        /* The out
e1b0: 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  put line number 
e1c0: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
e1d0: 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c  that we are stil
e1e0: 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  l in the.      *
e1f0: 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20  * main program. 
e200: 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26  */.      pOp = &
e210: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  p->aOp[i];.    }
e220: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
e230: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
e240: 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72  listing subprogr
e250: 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74  ams.  Figure out
e260: 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20   which one and. 
e270: 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20       ** pick up 
e280: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
e290: 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  opcode. */.     
e2a0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20   int j;.      i 
e2b0: 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  -= p->nOp;.     
e2c0: 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53   for(j=0; i>=apS
e2d0: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29  ub[j]->nOp; j++)
e2e0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61  {.        i -= a
e2f0: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[j]->nOp;.  
e300: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20      }.      pOp 
e310: 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70  = &apSub[j]->aOp
e320: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  [i];.    }..    
e330: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
e340: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
e350: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
e360: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
e370: 68 61 73 0a 20 20 20 20 2a 2a 20 61 20 50 34 5f  has.    ** a P4_
e380: 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d  SUBPROGRAM argum
e390: 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65  ent), expand the
e3a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
e3b0: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
e3c0: 73 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e  s.    ** kept in
e3d0: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
e3e0: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
e3f0: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
e400: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
e410: 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
e420: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65  already been see
e430: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
e440: 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20  ( bListSubprogs 
e450: 26 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  && pOp->p4type==
e460: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
e470: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
e480: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
e490: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
e4a0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
e4b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
e4c0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
e4d0: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
e4e0: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
e4f0: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
e500: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
e510: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
e520: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 56  p->rc = sqlite3V
e530: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
e540: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
e550: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
e560: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
e570: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
e580: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e590: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
e5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e5b0: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
e5c0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
e5d0: 3b 0a 20 20 20 20 20 20 20 20 61 70 53 75 62 5b  ;.        apSub[
e5e0: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
e5f0: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
e600: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
e610: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
e620: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
e630: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
e640: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
e650: 20 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d 3e 70 34   nRow += pOp->p4
e660: 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a  .pProgram->nOp;.
e670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e680: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
e690: 3c 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <2 ) break;.    
e6a0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
e6b0: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 20 62 72  =OP_Explain ) br
e6c0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  eak;.    if( pOp
e6d0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
e6e0: 74 20 26 26 20 70 2d 3e 70 63 3e 31 20 29 20 62  t && p->pc>1 ) b
e6f0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
e700: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e710: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 75 31  {.    if( db->u1
e720: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
e730: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
e740: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
e750: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
e760: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
e770: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
e780: 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  r(p, sqlite3ErrS
e790: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 20 20  tr(p->rc));.    
e7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
e7b0: 72 20 2a 7a 50 34 3b 0a 20 20 20 20 20 20 69 66  r *zP4;.      if
e7c0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
e7d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
e7e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e7f0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
e800: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
e830: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
e840: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
e850: 20 20 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d    .        pMem-
e860: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
e870: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
e880: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d  Term;.        pM
e890: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
e8a0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
e8b0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f  (pOp->opcode); /
e8c0: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
e8d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
e8e0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
e8f0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
e900: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
e910: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
e920: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
e930: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
e940: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a  Mem++;.      }..
e950: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e960: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e970: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
e980: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
e9b0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70  pMem++;..      p
e9c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e9d0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
e9e0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
ea10: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
ea20: 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ..      pMem->fl
ea30: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
ea40: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
ea50: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
ea80: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
ea90: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
eaa0: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
eab0: 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20  e(pMem, 100) ){ 
eac0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 20  /* P4 */.       
ead0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
eae0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
eaf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
eb00: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
eb10: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
eb20: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
eb30: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
eb40: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
eb50: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70  (pOp, pMem->z, p
eb60: 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a  Mem->szMalloc);.
eb70: 20 20 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70        if( zP4!=p
eb80: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
eb90: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20    pMem->n = 0;. 
eba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ebb0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
ebc0: 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54  , zP4, -1, SQLIT
ebd0: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20  E_UTF8, 0);.    
ebe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ebf0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
ec00: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
ec10: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
ec20: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
ec30: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
ec40: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
ec50: 46 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F8;.      }.    
ec60: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
ec70: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
ec80: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =1 ){.        if
ec90: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
eca0: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
ecb0: 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  Mem, 4) ){.     
ecc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ecd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ece0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
ecf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ed00: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
ed10: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
ed20: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
ed30: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
ed40: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
ed50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ed60: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
ed70: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
ed80: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
ed90: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
eda0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
edb0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
edc0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
edd0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
ede0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 20 20  OMMENTS.        
edf0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
ee00: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
ee10: 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20  (pMem, 500) ){. 
ee20: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ee30: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
ee40: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
ee50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ee60: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
ee70: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
ee80: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
ee90: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
eea0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c   pMem->n = displ
eeb0: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
eec0: 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30  P4, pMem->z, 500
eed0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
eee0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
eef0: 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  F8;.#else.      
ef00: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ef10: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65  /* Comment */.#e
ef40: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ndif.      }..  
ef50: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
ef60: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
ef70: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 20 20  plain-1);.      
ef80: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
ef90: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20  &p->aMem[1];.   
efa0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
efb0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  E_OK;.      rc =
efc0: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20   SQLITE_ROW;.   
efd0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
efe0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
eff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
f000: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
f010: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
f020: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
f030: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
f040: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
f050: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
f060: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
f070: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
f080: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
f090: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53  = 0;.  if( p->zS
f0a0: 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d  ql ){.    z = p-
f0b0: 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  >zSql;.  }else i
f0c0: 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a  f( p->nOp>=1 ){.
f0d0: 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70      const VdbeOp
f0e0: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
f0f0: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  0];.    if( pOp-
f100: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
f110: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
f120: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f   ){.      z = pO
f130: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77  p->p4.z;.      w
f140: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
f150: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
f160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
f170: 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a  z ) printf("SQL:
f180: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a   [%s]\n", z);.}.
f190: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
f1a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f1b0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
f1c0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
f1d0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
f1e0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
f1f0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
f200: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
f210: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
f220: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
f230: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
f240: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
f250: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
f260: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
f270: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
f280: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
f290: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
f2a0: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
f2b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
f2c0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
f2d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
f2e0: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
f2f0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
f300: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
f310: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
f320: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
f330: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70  i=0; sqlite3Issp
f340: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
f350: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
f360: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
f370: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70   if( sqlite3Issp
f380: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
f390: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
f3a0: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
f3b0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
f3c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
f3e0: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
f3f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f400: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
f410: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
f420: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
f430: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
f440: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
f450: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
f460: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20  _IOTRACE */../* 
f470: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
f480: 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72  his object descr
f490: 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  ibes bulk memory
f4a0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
f4b0: 73 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70  se.** by subcomp
f4c0: 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70  onents of a prep
f4d0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
f4e0: 20 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   Space is alloca
f4f0: 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20  ted out.** of a 
f500: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62  ReusableSpace ob
f510: 6a 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f  ject by the allo
f520: 63 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  cSpace() routine
f530: 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63   below..*/.struc
f540: 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  t ReusableSpace 
f550: 7b 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20  {.  u8 *pSpace; 
f560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76             /* Av
f570: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a  ailable memory *
f580: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
f590: 34 20 6e 46 72 65 65 3b 20 20 20 2f 2a 20 42 79  4 nFree;   /* By
f5a0: 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
f5b0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 73 71 6c   memory */.  sql
f5c0: 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e 65 65 64  ite3_int64 nNeed
f5d0: 65 64 3b 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74  ed; /* Total byt
f5e0: 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f  es that could no
f5f0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  t be allocated *
f600: 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20  /.};../* Try to 
f610: 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  allocate nByte b
f620: 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61  ytes of 8-byte a
f630: 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f  ligned bulk memo
f640: 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66  ry for pBuf.** f
f650: 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65  rom the Reusable
f660: 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52  Space object.  R
f670: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
f680: 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
f690: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75  .** memory on su
f6a0: 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66  ccess.  If insuf
f6b0: 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69  ficient memory i
f6c0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  s available in t
f6d0: 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70  he.** ReusableSp
f6e0: 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72  ace object, incr
f6f0: 65 61 73 65 20 74 68 65 20 52 65 75 73 61 62 6c  ease the Reusabl
f700: 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a  eSpace.nNeeded.*
f710: 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65 20 61  * value by the a
f720: 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64  mount needed and
f730: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
f740: 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e  .** If pBuf is n
f750: 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ot initially NUL
f760: 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  L, that means th
f770: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61  at the memory ha
f780: 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
f790: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61  n allocated by a
f7a0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74   prior call to t
f7b0: 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20  his routine, so 
f7c0: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
f7d0: 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e  py.** of pBuf an
f7e0: 64 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65  d leave Reusable
f7f0: 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e  Space unchanged.
f800: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f  .**.** This allo
f810: 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65  cator is employe
f820: 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75  d to repurpose u
f830: 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74  nused slots at t
f840: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
f850: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66   opcode array of
f860: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 20   prepared state 
f870: 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79  for other memory
f880: 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70 72   needs of the pr
f890: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
f8a0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
f8b0: 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28  oid *allocSpace(
f8c0: 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62  .  struct Reusab
f8d0: 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20  leSpace *p,  /* 
f8e0: 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  Bulk memory avai
f8f0: 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  lable for alloca
f900: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
f910: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
f920: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f930: 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61  o a prior alloca
f940: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
f950: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 20 20  3_int64 nByte   
f960: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
f970: 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f  memory needed */
f980: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49  .){.  assert( EI
f990: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
f9a0: 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b  NT(p->pSpace) );
f9b0: 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  .  if( pBuf==0 )
f9c0: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f  {.    nByte = RO
f9d0: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20  UND8(nByte);.   
f9e0: 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d   if( nByte <= p-
f9f0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  >nFree ){.      
fa00: 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  p->nFree -= nByt
fa10: 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  e;.      pBuf = 
fa20: 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46  &p->pSpace[p->nF
fa30: 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ree];.    }else{
fa40: 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65  .      p->nNeede
fa50: 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  d += nByte;.    
fa60: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
fa70: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
fa80: 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20  MENT(pBuf) );.  
fa90: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
faa0: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
fab0: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
fac0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
fad0: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
fae0: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
faf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
fb00: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
fb10: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
fb20: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
fb30: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
fb40: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
fb50: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
fb60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fb70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
fb80: 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d  MAGIC_INIT || p-
fb90: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
fba0: 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f  IC_RESET );..  /
fbb0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
fbc0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
fbd0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
fbe0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
fbf0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
fc00: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
fc10: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
fc20: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
fc30: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
fc40: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
fc50: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
fc60: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  _DEBUG.  for(i=0
fc70: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
fc80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
fc90: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
fca0: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
fcb0: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
fcc0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
fcd0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
fce0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
fcf0: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
fd00: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
fd10: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
fd20: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
fd30: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
fd40: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
fd50: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
fd60: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
fd70: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
fd80: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
fd90: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
fda0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
fdb0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
fdc0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
fdd0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
fde0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fdf0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
fe00: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
fe10: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
fe20: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
fe30: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
fe40: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
fe50: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
fe60: 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61  ting registers a
fe70: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
fe80: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
fe90: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
fea0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
feb0: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
fec0: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
fed0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
fee0: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
fef0: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
ff00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
ff10: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
ff20: 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68  tly once on each
ff30: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
ff40: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
ff50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ff60: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
ff70: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
ff80: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
ff90: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
ffa0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ffb0: 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c  ed, further call
ffc0: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
ffd0: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
ffe0: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
fff0: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
10000 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
10010 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
10020 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
10030 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
10040 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
10050 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
10060 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
10070 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
10080 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
10090 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
100a0 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
100b0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
100c0 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
100d0 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
100e0 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
100f0 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
10100 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
10110 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
10120 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
10130 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
10140 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
10170 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
10180 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
10190 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
101a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
101b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
101e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
101f0 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10210 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
10220 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
10230 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
10240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10250 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
10260 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
10270 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
102a0 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
102b0 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
102e0 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
102f0 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
10300 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
10310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10320 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10330 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65   struct Reusable
10340 53 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20  Space x;        
10350 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b  /* Reusable bulk
10360 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73   memory */..  as
10370 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
10380 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
10390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
103a0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
103b0 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
103c0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
103d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
103e0 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b  se==p->pParse );
103f0 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
10400 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
10410 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
10420 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
10430 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
10440 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10450 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
10460 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
10470 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
10480 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63  ;.  .  /* Each c
10490 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d  ursor uses a mem
104a0 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66  ory cell.  The f
104b0 69 72 73 74 20 63 75 72 73 6f 72 20 28 63 75 72  irst cursor (cur
104c0 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20  sor 0) can.  ** 
104d0 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63  use aMem[0] whic
104e0 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69  h is not otherwi
104f0 73 65 20 75 73 65 64 20 62 79 20 74 68 65 20 56  se used by the V
10500 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c  DBE program.  Al
10510 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63  locate.  ** spac
10520 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
10530 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f  aMem[] for curso
10540 72 73 20 31 20 61 6e 64 20 67 72 65 61 74 65 72  rs 1 and greater
10550 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  ..  ** See also:
10560 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
10570 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
10580 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  = nCursor;.  if(
10590 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e   nCursor==0 && n
105a0 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20  Mem>0 ) nMem++; 
105b0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d   /* Space for aM
105c0 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f  em[0] even if no
105d0 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  t used */..  /* 
105e0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
105f0 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d  uch reusable mem
10600 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ory is available
10610 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10620 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61  he.  ** opcode a
10630 72 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72  rray.  This extr
10640 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  a memory will be
10650 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72   reallocated for
10660 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a   other elements.
10670 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70    ** of the prep
10680 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
10690 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44    */.  n = ROUND
106a0 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e  8(sizeof(Op)*p->
106b0 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  nOp);           
106c0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f     /* Bytes of o
106d0 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65  pcode memory use
106e0 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20  d */.  x.pSpace 
106f0 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29  = &((u8*)p->aOp)
10700 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [n];            
10710 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63     /* Unused opc
10720 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ode memory */.  
10730 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
10740 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70  TE_ALIGNMENT(x.p
10750 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46  Space) );.  x.nF
10760 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38  ree = ROUNDDOWN8
10770 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c  (pParse->szOpAll
10780 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74  oc - n);  /* Byt
10790 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d  es of unused mem
107a0 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
107b0 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20   x.nFree>=0 );. 
107c0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
107d0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78  YTE_ALIGNMENT(&x
107e0 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d  .pSpace[x.nFree]
107f0 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ) );..  resolveP
10800 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
10810 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
10820 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
10830 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
10840 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
10850 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
10860 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10870 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
10880 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
10890 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
108a0 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
108b0 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
108c0 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
108d0 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
108e0 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74  ated in one or t
108f0 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20  wo.  ** passes. 
10900 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   On the first pa
10910 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65  ss, we try to re
10920 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72  use unused memor
10930 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  y at the .  ** e
10940 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
10950 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
10960 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
10970 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
10980 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
10990 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
109a0 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
109b0 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
109c0 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
109d0 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
109e0 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61  emainder using a
109f0 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c   fresh memory al
10a00 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
10a10 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
10a20 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
10a30 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
10a40 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
10a50 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
10a60 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72  e leftover memor
10a70 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
10a80 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
10a90 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e  .  This can sign
10aa0 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
10ab0 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
10ac0 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
10ad0 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
10ae0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
10af0 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  x.nNeeded = 0;. 
10b00 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
10b10 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 4d 65  Space(&x, 0, nMe
10b20 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
10b30 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
10b40 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 56  cSpace(&x, 0, nV
10b50 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  ar*sizeof(Mem));
10b60 0a 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c  .  p->apArg = al
10b70 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
10b80 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
10b90 29 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d  ));.  p->apCsr =
10ba0 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10bb0 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
10bc0 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10bd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10be0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10bf0 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65  TATUS.  p->anExe
10c00 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  c = allocSpace(&
10c10 78 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  x, 0, p->nOp*siz
10c20 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69  eof(i64));.#endi
10c30 66 0a 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65  f.  if( x.nNeede
10c40 64 20 29 7b 0a 20 20 20 20 78 2e 70 53 70 61 63  d ){.    x.pSpac
10c50 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73  e = p->pFree = s
10c60 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
10c70 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65  wNN(db, x.nNeede
10c80 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20  d);.    x.nFree 
10c90 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 20  = x.nNeeded;.   
10ca0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
10cb0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
10cc0 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
10cd0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d  pace(&x, p->aMem
10ce0 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
10cf0 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56  m));.      p->aV
10d00 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
10d10 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61  &x, p->aVar, nVa
10d20 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  r*sizeof(Mem));.
10d30 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
10d40 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10d50 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
10d60 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20  izeof(Mem*));.  
10d70 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61      p->apCsr = a
10d80 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
10d90 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
10da0 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
10db0 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  r*));.#ifdef SQL
10dc0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
10dd0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
10de0 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
10df0 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
10e00 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69  nExec, p->nOp*si
10e10 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
10e20 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
10e30 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72  p->pVList = pPar
10e40 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50  se->pVList;.  pP
10e50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20  arse->pVList =  
10e60 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
10e70 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
10e80 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  n;.  if( db->mal
10e90 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
10ea0 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20   p->nVar = 0;.  
10eb0 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30    p->nCursor = 0
10ec0 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
10ed0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
10ee0 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
10ef0 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61  rsor;.    p->nVa
10f00 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
10f10 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
10f20 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c  y(p->aVar, nVar,
10f30 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   db, MEM_Null);.
10f40 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
10f50 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  em;.    initMemA
10f60 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  rray(p->aMem, nM
10f70 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65  em, db, MEM_Unde
10f80 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73  fined);.    mems
10f90 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20  et(p->apCsr, 0, 
10fa0 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
10fb0 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
10fc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10fd0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
10fe0 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  US.    memset(p-
10ff0 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e  >anExec, 0, p->n
11000 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
11010 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
11020 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
11030 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
11040 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
11050 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
11060 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
11070 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
11080 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
11090 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
110a0 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
110b0 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
110c0 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
110d0 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
110e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
110f0 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20  t( pCx->pBtx==0 
11100 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  || pCx->eCurType
11110 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
11120 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43 78  );.  switch( pCx
11130 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20  ->eCurType ){.  
11140 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 53    case CURTYPE_S
11150 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ORTER: {.      s
11160 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
11170 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
11180 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11190 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43      }.    case C
111a0 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a  URTYPE_BTREE: {.
111b0 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 69        if( pCx->i
111c0 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
111d0 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70        if( pCx->p
111e0 42 74 78 20 29 20 73 71 6c 69 74 65 33 42 74 72  Btx ) sqlite3Btr
111f0 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
11200 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  x);.        /* T
11210 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
11220 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
11230 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
11240 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
11250 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
11260 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  l above. */.    
11270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11280 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63   assert( pCx->uc
11290 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
112a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
112b0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
112c0 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  Cx->uc.pCursor);
112d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
112e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
112f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11300 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
11310 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 56 54   case CURTYPE_VT
11320 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
11330 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
11340 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63  *pVCur = pCx->uc
11350 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f  .pVCur;.      co
11360 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
11370 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56  le *pModule = pV
11380 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64  Cur->pVtab->pMod
11390 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ule;.      asser
113a0 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d  t( pVCur->pVtab-
113b0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
113c0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
113d0 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f  Ref--;.      pMo
113e0 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43  dule->xClose(pVC
113f0 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ur);.      break
11400 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11410 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
11420 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e  e all cursors in
11430 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
11440 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
11450 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  id closeCursorsI
11460 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b  nFrame(Vdbe *p){
11470 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
11480 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
11490 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
114a0 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
114b0 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20       VdbeCursor 
114c0 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
114d0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20  ];.      if( pC 
114e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
114f0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
11500 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20  (p, pC);.       
11510 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
11520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11530 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70    }.}../*.** Cop
11540 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
11550 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
11560 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
11570 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
11580 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
11590 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
115a0 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
115b0 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
115c0 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
115d0 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
115e0 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
115f0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
11600 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
11610 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
11620 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
11630 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f  >v;.  closeCurso
11640 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69  rsInFrame(v);.#i
11650 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11660 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
11670 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d  US.  v->anExec =
11680 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b   pFrame->anExec;
11690 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70  .#endif.  v->aOp
116a0 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
116b0 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
116c0 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
116d0 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
116e0 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
116f0 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
11700 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
11710 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
11720 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
11730 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
11740 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
11750 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
11760 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
11770 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
11780 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65    v->db->nChange
11790 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68   = pFrame->nDbCh
117a0 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56  ange;.  sqlite3V
117b0 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
117c0 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78  (v->db, &v->pAux
117d0 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
117e0 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46  v->pAuxData = pF
117f0 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a  rame->pAuxData;.
11800 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61    pFrame->pAuxDa
11810 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ta = 0;.  return
11820 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
11830 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
11840 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
11850 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
11860 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
11870 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
11880 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
11890 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
118a0 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
118b0 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
118c0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
118d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
118e0 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
118f0 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
11900 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
11910 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
11920 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
11930 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
11940 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
11950 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
11960 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
11970 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
11980 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
11990 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
119a0 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
119b0 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
119c0 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
119d0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
119e0 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
119f0 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20  ;.    p->pFrame 
11a00 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61  = 0;.    p->nFra
11a10 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  me = 0;.  }.  as
11a20 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d  sert( p->nFrame=
11a30 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72  =0 );.  closeCur
11a40 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a  sorsInFrame(p);.
11a50 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
11a60 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
11a70 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d  rray(p->aMem, p-
11a80 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
11a90 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
11aa0 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
11ab0 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
11ac0 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
11ad0 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
11ae0 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
11af0 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
11b00 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
11b10 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
11b20 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
11b30 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
11b40 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e VM */.  if( p-
11b50 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c 69  >pAuxData ) sqli
11b60 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
11b70 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e  Data(p->db, &p->
11b80 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
11b90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
11ba0 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
11bb0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
11bc0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
11bd0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
11be0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
11bf0 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
11c00 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
11c10 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
11c20 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
11c30 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
11c40 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
11c50 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
11c60 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
11c70 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
11c80 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
11c90 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
11ca0 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
11cb0 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
11cc0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
11cd0 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
11ce0 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
11cf0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
11d00 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11d10 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f  .  if( p->nResCo
11d20 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65  lumn ){.    rele
11d30 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
11d40 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
11d50 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
11d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
11d70 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
11d80 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d  Name);.  }.  n =
11d90 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
11da0 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
11db0 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
11dc0 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
11dd0 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
11de0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
11df0 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
11e00 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
11e10 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
11e20 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d   return;.  initM
11e30 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
11e40 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f  ame, n, db, MEM_
11e50 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Null);.}../*.** 
11e60 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
11e70 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
11e80 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
11e90 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
11ea0 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
11eb0 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
11ec0 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
11ed0 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
11ee0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
11ef0 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
11f00 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
11f10 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
11f20 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
11f30 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
11f40 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
11f50 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
11f60 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
11f70 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
11f80 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
11f90 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
11fa0 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
11fb0 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
11fc0 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
11fd0 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
11fe0 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
11ff0 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
12000 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
12010 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
12020 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
12050 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
12060 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12090 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
120a0 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
120b0 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120d0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
120e0 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
120f0 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
12100 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
12110 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12120 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
12130 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
12140 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
12150 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
12160 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
12170 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
12180 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
12190 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
121a0 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
121b0 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
121c0 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
121d0 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
121e0 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
121f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12200 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12210 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
12220 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
12230 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12240 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
12250 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
12260 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
12270 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
12280 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76  ->aColName[idx+v
12290 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  ar*p->nResColumn
122a0 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
122b0 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
122c0 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
122d0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
122e0 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72  , xDel);.  asser
122f0 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61  t( rc!=0 || !zNa
12300 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d  me || (pColName-
12310 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29  >flags&MEM_Term)
12320 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
12330 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
12340 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
12350 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
12360 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
12370 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
12380 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
12390 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
123a0 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
123b0 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
123c0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
123d0 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
123e0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
123f0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
12400 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
12410 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
12420 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
12430 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
12440 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
12450 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
12460 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
12470 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30    int nTrans = 0
12480 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
12490 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61  databases with a
124a0 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74  n active write-t
124b0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
124d0 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69 64   that are candid
124e0 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70  ates for a two-p
124f0 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e  hase commit usin
12500 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  g a.            
12510 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72         ** master
12520 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  -journal */.  in
12530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12540 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
12550 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
12560 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
12570 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
12580 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
12590 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
125a0 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
125b0 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
125c0 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
125d0 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
125e0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
125f0 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
12600 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
12610 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
12620 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
12630 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
12640 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
12650 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
12660 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
12670 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
12680 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
12690 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
126a0 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
126b0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
126c0 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
126d0 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
126e0 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
126f0 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
12700 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
12710 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
12720 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
12730 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
12740 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a  nc(db, p);..  /*
12750 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
12760 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
12770 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
12780 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
12790 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
127a0 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
127b0 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
127c0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
127d0 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
127e0 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
127f0 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
12800 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
12810 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
12820 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
12830 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
12840 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
12850 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
12860 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
12870 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
12880 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
12890 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
128a0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
128b0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
128c0 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
128d0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
128e0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
128f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
12900 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
12910 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f      /* Whether o
12920 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  r not a database
12930 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61   might need a ma
12940 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70  ster journal dep
12950 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20  ends upon.      
12960 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d  ** its journal m
12970 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72  ode (among other
12980 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20   things).  This 
12990 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65  matrix determine
129a0 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  s which.      **
129b0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75   journal modes u
129c0 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  se a master jour
129d0 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f  nal and which do
129e0 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74   not */.      st
129f0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d  atic const u8 aM
12a00 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20  JNeeded[] = {.  
12a10 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20        /* DELETE 
12a20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20    */  1,.       
12a30 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f   /* PERSIST   */
12a40 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   1,.        /* O
12a50 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  FF       */ 0,. 
12a60 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41         /* TRUNCA
12a70 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20  TE  */ 1,.      
12a80 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a    /* MEMORY    *
12a90 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 0,.        /* 
12aa0 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20  WAL       */ 0. 
12ab0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61       };.      Pa
12ac0 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f  ger *pPager;   /
12ad0 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74  * Pager associat
12ae0 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20  ed with pBt */. 
12af0 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
12b00 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
12b10 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
12b20 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  t);.      pPager
12b30 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
12b40 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
12b50 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
12b60 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41  safety_level!=PA
12b70 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
12b80 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d  OFF.       && aM
12b90 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50  JNeeded[sqlite3P
12ba0 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerGetJournalMo
12bb0 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20  de(pPager)].    
12bc0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
12bd0 65 72 49 73 4d 65 6d 64 62 28 70 50 61 67 65 72  erIsMemdb(pPager
12be0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 20 0a 20  )==0.      ){ . 
12bf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
12c00 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  !=1 );.        n
12c10 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d  Trans++;.      }
12c20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12c30 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
12c40 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
12c50 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12c60 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
12c70 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
12c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12ca0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
12cb0 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
12cc0 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
12cd0 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
12ce0 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
12cf0 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
12d00 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
12d10 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
12d20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
12d30 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
12d40 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
12d50 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
12d60 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
12d70 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a  INT_COMMITHOOK;.
12d80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12d90 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
12da0 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
12db0 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
12dc0 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
12dd0 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
12de0 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
12df0 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
12e00 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
12e10 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
12e20 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
12e30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
12e40 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
12e50 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
12e60 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
12e70 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
12e80 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
12e90 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
12ea0 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
12eb0 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
12ec0 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
12ed0 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
12ee0 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
12ef0 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
12f00 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
12f10 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
12f20 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
12f30 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
12f40 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
12f50 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
12f60 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
12f70 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
12f80 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
12f90 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
12fa0 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
12fb0 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
12fc0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
12fd0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
12fe0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
12ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
13000 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
13010 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
13020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
13030 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
13040 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
13050 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
13060 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
13070 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
13080 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
13090 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
130a0 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
130b0 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
130c0 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
130d0 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
130e0 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
130f0 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
13100 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
13110 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
13120 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
13130 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
13140 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
13150 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
13160 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
13170 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
13180 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
13190 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
131a0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
131b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
131c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
131d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
131e0 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
131f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13200 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13220 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
13230 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
13240 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
13250 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
13260 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
13270 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13280 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
13290 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
132a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
132b0 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
132c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
132d0 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
132e0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f  atomically..  */
132f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13300 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
13310 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
13320 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
13330 70 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a  pVfs;.    char *
13340 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
13350 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
13360 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13370 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
13380 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
13390 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
133a0 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
133b0 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
133c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
133d0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
133e0 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
133f0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
13400 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20  nt retryCount = 
13410 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e  0;.    int nMain
13420 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  File;..    /* Se
13430 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
13440 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
13450 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65  */.    nMainFile
13460 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
13470 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  30(zMainFile);. 
13480 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
13490 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
134a0 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a  "%s-mjXXXXXX9XXz
134b0 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  ", zMainFile);. 
134c0 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d     if( zMaster==
134d0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
134e0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
134f0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
13500 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
13510 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29  if( retryCount )
13520 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
13530 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a  tryCount>100 ){.
13540 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13550 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
13560 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25  L, "MJ delete: %
13570 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
13580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
13590 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
135a0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
135b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
135c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
135d0 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20  tryCount==1 ){. 
135e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
135f0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
13600 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25  , "MJ collide: %
13610 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
13620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13630 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74        retryCount
13640 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
13650 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
13660 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
13670 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73  Random);.      s
13680 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
13690 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61  13, &zMaster[nMa
136a0 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36  inFile], "-mj%06
136b0 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20  X9%02X",.       
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d          (iRandom
136e0 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69  >>8)&0xffffff, i
136f0 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20  Random&0xff);.  
13700 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70      /* The antip
13710 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61  enultimate chara
13720 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74  cter of the mast
13730 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
13740 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
13750 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61   "9" to avoid na
13760 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68  me collisions wh
13770 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c  en using 8+3 fil
13780 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20  enames. */.     
13790 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72   assert( zMaster
137a0 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
137b0 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39  (zMaster)-3]=='9
137c0 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ' );.      sqlit
137d0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d  e3FileSuffix3(zM
137e0 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72  ainFile, zMaster
137f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13800 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
13810 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
13820 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
13830 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
13840 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
13850 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
13860 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13870 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
13880 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
13890 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
138a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
138b0 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
138c0 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
138d0 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
138e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
138f0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
13900 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
13910 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
13920 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
13930 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
13940 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
13950 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
13960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13970 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
13980 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
13990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
139a0 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
139b0 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
139c0 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
139d0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
139e0 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
139f0 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
13a00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13a10 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
13a20 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
13a30 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
13a40 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
13a50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13a60 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
13a70 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
13a80 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
13a90 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
13aa0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13ab0 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
13ac0 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
13ad0 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
13ae0 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
13af0 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
13b00 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
13b10 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
13b20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
13b30 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
13b40 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
13b50 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
13b60 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
13b70 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
13b80 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
13b90 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
13ba0 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
13bb0 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
13bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
13bd0 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
13be0 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
13bf0 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
13c00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13c10 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
13c20 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
13c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13c40 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
13c50 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
13c60 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
13c70 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
13c80 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
13c90 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
13ca0 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
13cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
13cd0 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
13ce0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
13cf0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
13d00 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
13d10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13d20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13d30 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13d40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13d60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
13d70 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
13d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
13d90 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
13da0 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
13db0 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
13dc0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
13dd0 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
13de0 20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69 74 65    if( 0==(sqlite
13df0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
13e00 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
13e10 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
13e20 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
13e30 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
13e40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
13e50 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
13e60 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
13e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
13e80 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
13e90 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
13ea0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13eb0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
13ec0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13ed0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
13ee0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
13ef0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
13f00 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
13f10 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
13f20 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
13f30 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
13f40 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
13f50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13f60 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
13f70 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
13f80 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
13f90 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
13fa0 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
13fb0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
13fc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
13fd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
13fe0 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
13ff0 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
14000 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
14010 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14020 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
14030 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
14040 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
14050 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
14060 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
14070 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
14080 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
14090 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
140a0 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
140b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
140c0 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
140d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
140e0 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
140f0 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
14100 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
14110 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
14120 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
14130 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
14140 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
14150 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
14160 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
14170 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14180 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
14190 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
141a0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
141b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
141c0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
141d0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
141e0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  rt( rc!=SQLITE_B
141f0 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  USY );.    if( r
14200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14210 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
14220 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
14230 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
14240 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
14250 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
14260 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
14270 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
14280 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
14290 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
142a0 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
142b0 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
142c0 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
142d0 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
142e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
142f0 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
14300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
14310 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
14320 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
14330 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
14340 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
14350 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
14360 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
14370 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14380 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
14390 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
143a0 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
143b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
143c0 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
143d0 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
143e0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
143f0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
14400 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
14410 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
14420 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
14430 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
14440 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
14450 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
14460 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
14470 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
14480 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
14490 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
144a0 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
144b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
144c0 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
144d0 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
144e0 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
144f0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
14500 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
14510 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
14520 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
14530 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
14540 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
14550 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
14560 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
14570 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
14580 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
14590 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
145a0 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
145b0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
145c0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
145d0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
145e0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
145f0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
14600 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14610 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
14620 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14630 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
14640 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
14650 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
14660 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
14670 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
14680 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
14690 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
146a0 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
146b0 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65  ite3.nVdbeActive
146c0 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
146d0 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
146e0 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
146f0 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
14700 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
14710 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
14720 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
14730 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
14740 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
14750 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
14760 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
14770 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
14780 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
14790 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
147a0 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
147b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
147c0 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
147d0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
147e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
147f0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
14800 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
14810 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
14820 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
14830 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
14840 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61   = 0;.  int nRea
14850 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  d = 0;.  p = db-
14860 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
14870 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71   p ){.    if( sq
14880 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
14890 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
148a0 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ) ){.      cnt++
148b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
148c0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
148d0 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ite++;.      if(
148e0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
148f0 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nRead++;.    }. 
14900 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
14910 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
14920 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74  nt==db->nVdbeAct
14930 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ive );.  assert(
14940 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64   nWrite==db->nVd
14950 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73  beWrite );.  ass
14960 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e  ert( nRead==db->
14970 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23  nVdbeRead );.}.#
14980 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
14990 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
149a0 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
149b0 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
149c0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
149d0 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
149e0 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
149f0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
14a00 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
14a10 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
14a20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
14a30 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
14a40 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14a50 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
14a60 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
14a70 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
14a80 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
14a90 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
14aa0 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
14ab0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
14ac0 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
14ad0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14ae0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
14af0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
14b00 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
14b10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
14b20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
14b30 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
14b40 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
14b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
14b60 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
14b70 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  vdbeCloseStateme
14b80 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
14b90 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
14ba0 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
14bb0 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
14bc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
14bd0 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53  ;.  const int iS
14be0 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
14bf0 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61  tatement-1;..  a
14c00 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45  ssert( eOp==SAVE
14c10 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
14c20 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  | eOp==SAVEPOINT
14c30 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 61 73 73  _RELEASE);.  ass
14c40 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
14c50 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
14c60 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
14c70 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
14c80 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
14c90 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ) );..  for(i=0;
14ca0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
14cb0 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  { .    int rc2 =
14cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14cd0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
14ce0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
14cf0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
14d00 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
14d10 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
14d20 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73  .        rc2 = s
14d30 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
14d40 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
14d50 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
14d60 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
14d70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 32   }.      if( rc2
14d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14d90 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
14da0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
14db0 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
14dc0 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
14dd0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
14de0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14e00 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
14e10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
14e20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
14e30 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  -;.  p->iStateme
14e40 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72  nt = 0;..  if( r
14e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14e60 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
14e70 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14e80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
14e90 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
14ea0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
14eb0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
14ec0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
14ed0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14ee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14ef0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
14f00 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
14f10 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
14f20 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
14f30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14f40 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
14f50 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
14f60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
14f70 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
14f80 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
14f90 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
14fa0 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
14fb0 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
14fc0 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a  t had when .  **
14fd0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
14fe0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
14ff0 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28  pened.  */.  if(
15000 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
15010 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
15020 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
15030 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43  s = p->nStmtDefC
15040 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  ons;.    db->nDe
15050 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
15060 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f  p->nStmtDefImmCo
15070 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ns;.  }.  return
15080 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
15090 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
150a0 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
150b0 74 20 65 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d  t eOp){.  if( p-
150c0 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20  >db->nStatement 
150d0 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
150e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 76   ){.    return v
150f0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
15100 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20  t(p, eOp);.  }. 
15110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15120 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
15130 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15140 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
15150 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
15160 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
15170 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
15180 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
15190 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
151a0 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
151b0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
151c0 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
151d0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
151e0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
151f0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
15200 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
15210 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15220 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
15230 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
15240 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
15250 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
15260 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
15270 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
15280 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
15290 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
152a0 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
152b0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
152c0 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
152d0 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
152e0 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
152f0 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
15300 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
15310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15320 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
15330 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
15340 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
15350 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
15360 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
15370 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
15380 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
15390 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
153a0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
153b0 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
153c0 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
153d0 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
153e0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
153f0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
15400 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
15410 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
15420 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
15430 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
15440 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   "FOREIGN KEY co
15450 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
15460 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15470 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
15480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15490 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
154a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
154b0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
154c0 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
154d0 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
154e0 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
154f0 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
15500 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
15510 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
15520 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
15530 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
15540 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
15550 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
15560 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
15570 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
15580 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
15590 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
155a0 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
155b0 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
155c0 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
155d0 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
155e0 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
155f0 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
15600 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
15610 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
15620 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
15630 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
15640 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
15650 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
15660 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
15670 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
15680 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
15690 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
156a0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
156b0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
156c0 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
156d0 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
156e0 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
156f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
15700 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
15710 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
15740 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
15750 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
15760 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
15770 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
15780 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
15790 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
157a0 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
157b0 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
157c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
157d0 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
157e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
157f0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
15800 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
15810 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
15820 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
15830 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
15840 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
15850 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
15860 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
15870 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
15880 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
15890 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
158a0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
158b0 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
158c0 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
158d0 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
158e0 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
158f0 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
15900 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
15910 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
15920 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
15930 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
15940 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
15950 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
15960 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
15970 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
15980 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
15990 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
159a0 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
159b0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
159c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
159d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  _OK;.  }.  if( d
159e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
159f0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
15a00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
15a10 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
15a20 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 63 68  Cursors(p);.  ch
15a30 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
15a40 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
15a50 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
15a60 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
15a70 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
15a80 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a  arted or if the.
15a90 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
15aa0 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64  nt does not read
15ab0 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61   or write a data
15ac0 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20  base file.  */. 
15ad0 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26   if( p->pc>=0 &&
15ae0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b   p->bIsReader ){
15af0 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
15b00 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
15b10 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
15b20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
15b30 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
15b40 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
15b50 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
15b60 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
15b70 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
15b80 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
15b90 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
15ba0 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
15bb0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
15bc0 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
15bd0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
15be0 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
15bf0 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
15c00 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
15c10 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53   & 0xff;.    isS
15c20 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
15c30 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
15c40 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
15c50 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
15c60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
15c70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
15c80 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
15c90 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
15ca0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
15cb0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
15cc0 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
15cd0 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
15ce0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
15cf0 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
15d00 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
15d10 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
15d20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
15d30 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
15d40 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
15d50 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
15d60 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
15d70 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
15d80 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
15d90 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
15da0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
15db0 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
15dc0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
15dd0 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
15de0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
15df0 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
15e00 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
15e10 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
15e20 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
15e30 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
15e40 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68    ** occurred wh
15e50 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
15e60 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
15e70 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
15e80 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
15e90 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
15ea0 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
15eb0 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
15ec0 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
15ed0 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
15ee0 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
15ef0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
15f00 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
15f10 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
15f20 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
15f30 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
15f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15f50 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
15f60 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
15f70 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
15f80 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
15f90 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
15fa0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
15fb0 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
15fc0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
15fd0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
15fe0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
15ff0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
16000 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
16010 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
16020 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
16030 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
16040 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
16050 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
16060 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
16070 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
16080 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
16090 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
160a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
160b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
160c0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
160d0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
160e0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
160f0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
16100 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
16110 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16120 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
16130 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
16140 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
16150 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16160 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
16170 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
16180 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
16190 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
161a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
161b0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
161c0 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
161d0 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
161e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
161f0 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
16200 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
16210 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
16220 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
16230 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
16240 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
16250 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
16260 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
16270 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
16280 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
16290 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
162a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
162b0 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
162c0 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
162d0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
162e0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
162f0 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
16300 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
16310 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
16320 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
16330 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
16340 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
16350 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  & db->nVdbeWrite
16360 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
16370 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
16380 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16390 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
163a0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
163b0 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
163c0 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
163d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
163e0 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
163f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16410 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
16420 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
16430 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16440 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
16450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
16460 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16470 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
16480 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
16490 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
164a0 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
164b0 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
164c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
164d0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
164e0 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20   true, the vdbe 
164f0 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63  program was succ
16500 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20  essful .        
16510 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27    ** or hit an '
16520 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
16530 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
16540 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e no deferred fo
16550 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20  reign.          
16560 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  ** key constrain
16570 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68  ts to hold up th
16580 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
16590 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d  his means a comm
165a0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  it .          **
165b0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
165c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
165d0 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
165e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
165f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16600 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72  ITE_BUSY && p->r
16610 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
16620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16630 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
16640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16650 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
16660 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
16670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16680 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
16690 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
166a0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
166b0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
166c0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
166d0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
166e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
166f0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
16700 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
16710 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
16720 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  mmCons = 0;.    
16730 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
16740 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f  &= ~(u64)SQLITE_
16750 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20  DeferFKs;.      
16760 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
16770 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
16780 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
16790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
167a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
167b0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
167c0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
167d0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
167e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
167f0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
16800 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16810 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
16820 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
16830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
16840 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
16850 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
16860 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
16870 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
16880 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
16890 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
168a0 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
168b0 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
168c0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
168d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
168e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
168f0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
16900 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
16910 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
16920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16930 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
16940 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
16950 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
16960 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
16970 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
16980 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16990 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
169a0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
169b0 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
169c0 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
169d0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
169e0 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
169f0 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
16a00 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
16a10 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
16a20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
16a30 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
16a40 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
16a50 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
16a60 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
16a70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
16a80 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
16a90 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
16aa0 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
16ab0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
16ac0 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
16ad0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
16ae0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
16af0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
16b00 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
16b10 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
16b20 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
16b30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
16b40 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16b50 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
16b60 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
16b70 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
16b80 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
16b90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16ba0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16bb0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
16bc0 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
16bd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
16be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
16bf0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
16c00 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
16c10 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
16c20 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
16c30 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
16c40 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
16c50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
16c60 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
16c70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
16c80 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
16c90 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
16ca0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
16cb0 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
16cc0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
16cd0 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
16ce0 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
16cf0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
16d00 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
16d10 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
16d20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
16d30 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
16d40 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
16d50 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
16d60 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
16d70 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
16d80 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
16d90 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
16da0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
16db0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
16dc0 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
16dd0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
16de0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
16df0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
16e00 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
16e10 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
16e20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
16e30 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
16e40 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
16e50 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
16e60 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
16e70 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
16e80 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62   ){.    db->nVdb
16e90 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69  eActive--;.    i
16ea0 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
16eb0 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ) db->nVdbeWrite
16ec0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  --;.    if( p->b
16ed0 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e  IsReader ) db->n
16ee0 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20  VdbeRead--;.    
16ef0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
16f00 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64  eActive>=db->nVd
16f10 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73  beRead );.    as
16f20 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52  sert( db->nVdbeR
16f30 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ead>=db->nVdbeWr
16f40 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ite );.    asser
16f50 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  t( db->nVdbeWrit
16f60 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  e>=0 );.  }.  p-
16f70 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
16f80 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
16f90 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
16fa0 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b);.  if( db->ma
16fb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
16fc0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16fd0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
16fe0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
16ff0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
17000 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
17010 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
17020 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
17030 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
17040 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
17050 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
17060 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
17070 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
17080 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
17090 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
170a0 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
170b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
170c0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
170d0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
170e0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
170f0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
17100 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
17110 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
17120 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
17130 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
17140 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
17150 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
17160 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
17170 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
17180 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
17190 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
171a0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
171b0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
171c0 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
171d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
171e0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
171f0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
17200 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
17210 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
17220 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
17230 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
17240 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17250 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
17260 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
17270 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
17280 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
17290 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
172a0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
172b0 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
172c0 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
172d0 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
172e0 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
172f0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
17300 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
17310 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
17320 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
17330 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
17340 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
17350 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
17360 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
17370 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
17380 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
17390 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
173a0 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
173b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
173c0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
173d0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
173e0 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
173f0 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
17400 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c  alloc++;.    sql
17410 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
17420 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
17430 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64   db->pErr==0 ) d
17440 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65  b->pErr = sqlite
17450 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
17460 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
17470 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
17480 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
17490 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
174a0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
174b0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
174c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
174d0 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
174e0 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69  loc--;.  }else i
174f0 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20  f( db->pErr ){. 
17500 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
17510 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29  etNull(db->pErr)
17520 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43  ;.  }.  db->errC
17530 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  ode = rc;.  retu
17540 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
17550 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17560 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
17570 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
17580 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
17590 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
175a0 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
175b0 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
175c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
175d0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
175e0 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
175f0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
17600 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
17610 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
17620 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
17630 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
17640 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
17650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
17660 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
17670 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
17680 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
17690 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
176a0 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
176b0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
176c0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
176d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
176e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
176f0 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
17700 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
17710 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
17720 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
17730 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
17740 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
17750 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
17760 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
17770 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
17780 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
17790 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
177a0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
177b0 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
177c0 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
177d0 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
177e0 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
177f0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
17800 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
17810 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17820 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
17830 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
17840 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
17850 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
17860 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
17870 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
17880 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
17890 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
178a0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
178b0 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
178c0 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
178d0 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
178e0 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
178f0 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
17900 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
17910 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
17920 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
17930 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
17940 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
17950 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
17960 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
17970 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
17980 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
17990 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
179a0 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
179b0 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
179c0 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
179d0 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
179e0 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
179f0 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
17a00 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
17a10 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
17a20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
17a30 44 42 45 20 68 61 73 20 62 65 65 6e 20 72 75 6e  DBE has been run
17a40 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
17a50 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
17a60 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
17a70 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
17a80 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
17a90 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
17aa0 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
17ab0 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
17ac0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
17ad0 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
17ae0 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
17af0 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
17b00 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
17b10 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
17b20 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
17b30 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
17b40 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
17b50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
17b60 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62  pc>=0 ){.    vdb
17b70 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29  eInvokeSqllog(p)
17b80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17b90 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70  eTransferError(p
17ba0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  );.    if( p->ru
17bb0 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
17bc0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
17bd0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
17be0 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
17bf0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
17c00 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
17c10 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
17c20 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
17c30 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
17c40 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
17c50 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
17c60 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
17c70 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
17c80 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
17c90 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
17ca0 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
17cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
17cc0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
17cd0 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
17ce0 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
17cf0 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
17d00 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
17d10 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74  register content
17d20 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65 72  s and reclaim er
17d30 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f  ror message memo
17d40 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ry..  */.#ifdef 
17d50 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
17d60 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
17d70 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
17d80 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
17d90 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
17da0 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
17db0 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
17dc0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
17dd0 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
17de0 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
17df0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
17e00 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
17e10 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
17e20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
17e30 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  m ){.    for(i=0
17e40 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
17e50 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
17e60 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
17e70 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d  Undefined );.  }
17e80 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
17e90 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
17ea0 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
17eb0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
17ec0 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
17ed0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17ee0 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74 65 20  BUG.  p->nWrite 
17ef0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  = 0;.#endif..  /
17f00 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
17f10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
17f20 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
17f30 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
17f40 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
17f50 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
17f60 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
17f70 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
17f80 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
17f90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
17fa0 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
17fb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
17fc0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
17fd0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
17fe0 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
17ff0 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
18000 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
18010 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
18020 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
18030 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20          char c, 
18040 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
18050 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
18060 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   ");.        for
18070 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53  (i=0; (c = p->zS
18080 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  ql[i])!=0; i++){
18090 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
180a0 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c=='\n' ) fprint
180b0 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
180c0 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c           putc(c,
180d0 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20   out);.         
180e0 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20   pc = c;.       
180f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
18100 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c!='\n' ) fprint
18110 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
18120 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
18130 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
18140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
18150 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20  r zHdr[100];.   
18160 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
18170 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64  rintf(sizeof(zHd
18180 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25  r), zHdr, "%6u %
18190 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20  12llu %8llu ",. 
181a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
181b0 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
181c0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
181d0 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
181e0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
181f0 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
18200 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
18210 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
18220 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
18230 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72  (out, "%s", zHdr
18240 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18250 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
18260 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
18270 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18280 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
18290 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
182a0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
182b0 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20  _MAGIC_RESET;.  
182c0 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
182d0 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
182e0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
182f0 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
18300 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
18310 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
18320 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
18330 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
18340 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
18350 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
18360 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
18370 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
18380 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
18390 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
183a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
183b0 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
183c0 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
183d0 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
183e0 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
183f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
18400 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
18410 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
18420 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
18430 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
18440 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
18450 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18460 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
18470 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
18480 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
18490 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
184a0 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
184b0 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
184c0 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
184d0 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
184e0 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
184f0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
18500 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
18510 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
18520 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
18530 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
18540 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
18550 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
18560 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
18570 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
18580 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
18590 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
185a0 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
185b0 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
185c0 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
185d0 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
185e0 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
185f0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
18600 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
18610 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
18620 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
18630 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
18640 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
18650 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
18660 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
18670 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
18680 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
18690 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
186a0 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
186b0 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
186c0 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
186d0 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
186e0 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
186f0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
18700 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64  xData(sqlite3 *d
18710 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c  b, AuxData **pp,
18720 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
18730 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70  sk){.  while( *p
18740 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61  p ){.    AuxData
18750 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20   *pAux = *pp;.  
18760 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20    if( (iOp<0).  
18770 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75     || (pAux->iAu
18780 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20  xOp==iOp.       
18790 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75 78     && pAux->iAux
187a0 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  Arg>=0.         
187b0 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78 41   && (pAux->iAuxA
187c0 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20  rg>31 || !(mask 
187d0 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78  & MASKBIT32(pAux
187e0 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20 20  ->iAuxArg)))).  
187f0 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
18800 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78 41  ase( pAux->iAuxA
18810 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
18820 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
18830 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20  eAux ){.        
18840 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78  pAux->xDeleteAux
18850 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
18860 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
18870 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78  = pAux->pNextAux
18880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
18890 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b  bFree(db, pAux);
188a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
188b0 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65    pp= &pAux->pNe
188c0 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  xtAux;.    }.  }
188d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
188e0 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
188f0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
18900 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
18910 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
18920 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
18930 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
18940 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
18950 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
18960 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
18980 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
18990 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
189a0 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
189b0 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
189c0 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
189d0 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
189e0 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
189f0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18a00 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
18a10 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
18a20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18a30 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
18a40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
18a50 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
18a60 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
18a70 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  t;.  assert( p->
18a80 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
18a90 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
18aa0 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
18ab0 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
18ac0 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
18ad0 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72   for(pSub=p->pPr
18ae0 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75  ogram; pSub; pSu
18af0 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  b=pNext){.    pN
18b00 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78  ext = pSub->pNex
18b10 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f  t;.    vdbeFreeO
18b20 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d  pArray(db, pSub-
18b30 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29  >aOp, pSub->nOp)
18b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
18b50 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ree(db, pSub);. 
18b60 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69   }.  if( p->magi
18b70 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
18b80 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  IT ){.    releas
18b90 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
18ba0 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  r, p->nVar);.   
18bb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18bc0 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20  b, p->pVList);. 
18bd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18be0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
18bf0 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70    }.  vdbeFreeOp
18c00 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
18c10 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
18c20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18c30 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
18c40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18c50 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65   p->zSql);.#ifde
18c60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18c70 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73 71 6c 69  NORMALIZE.  sqli
18c80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18c90 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 20 20 7b 0a  >zNormSql);.  {.
18ca0 20 20 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20      DblquoteStr 
18cb0 2a 70 54 68 69 73 2c 20 2a 70 4e 65 78 74 3b 0a  *pThis, *pNext;.
18cc0 20 20 20 20 66 6f 72 28 70 54 68 69 73 3d 70 2d      for(pThis=p-
18cd0 3e 70 44 62 6c 53 74 72 3b 20 70 54 68 69 73 3b  >pDblStr; pThis;
18ce0 20 70 54 68 69 73 3d 70 4e 65 78 74 29 7b 0a 20   pThis=pNext){. 
18cf0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 54 68       pNext = pTh
18d00 69 73 2d 3e 70 4e 65 78 74 53 74 72 3b 0a 20 20  is->pNextStr;.  
18d10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18d20 65 28 64 62 2c 20 70 54 68 69 73 29 3b 0a 20 20  e(db, pThis);.  
18d30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
18d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18d50 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
18d60 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  TUS.  {.    int 
18d70 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
18d80 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29  i<p->nScan; i++)
18d90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
18da0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
18db0 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  an[i].zName);.  
18dc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
18dd0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
18de0 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  an);.  }.#endif.
18df0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
18e00 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
18e10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18e20 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
18e30 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
18e40 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
18e50 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
18e60 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
18e70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18e80 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
18e90 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
18ea0 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
18eb0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
18ec0 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
18ed0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
18ee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
18ef0 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
18f00 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
18f10 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
18f20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
18f30 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
18f40 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
18f50 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
18f60 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
18f70 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
18f80 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
18f90 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
18fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
18fb0 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65  sor "p" has a pe
18fc0 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61  nding seek opera
18fd0 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
18fe0 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61  t yet been.** ca
18ff0 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b  rried out.  Seek
19000 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e   the cursor now.
19010 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
19020 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
19030 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
19040 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
19050 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
19060 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
19070 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56  DeferredMoveto(V
19080 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
19090 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
190a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
190b0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
190c0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
190d0 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  nt;.#endif.  ass
190e0 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64  ert( p->deferred
190f0 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65  Moveto );.  asse
19100 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
19110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
19120 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
19130 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d  _BTREE );.  rc =
19140 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
19150 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75  etoUnpacked(p->u
19160 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  c.pCursor, 0, p-
19170 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
19180 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
19190 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
191a0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
191b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
191c0 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
191d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
191e0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
191f0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
19200 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
19210 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
19220 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
19230 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
19240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19250 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
19260 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
19270 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
19280 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
19290 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
192a0 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
192b0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
192c0 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
192d0 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
192e0 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
192f0 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
19300 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
19310 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
19320 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
19330 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
19340 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
19350 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
19360 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
19370 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
19380 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
19390 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
193a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
193b0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
193c0 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
193d0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
193e0 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
193f0 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
19400 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
19410 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
19420 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63  .  assert( p->uc
19430 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
19440 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19450 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
19460 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
19470 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
19480 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
19490 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75  estore(p->uc.pCu
194a0 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65  rsor, &isDiffere
194b0 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63  ntRow);.  p->cac
194c0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
194d0 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73  _STALE;.  if( is
194e0 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70  DifferentRow ) p
194f0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
19500 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19510 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e  *.** Check to en
19520 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
19530 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
19540 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
19550 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65  or.** if need be
19560 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f  .  Return any I/
19570 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65  O error from the
19580 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69   restore operati
19590 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
195a0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
195b0 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a  ore(VdbeCursor *
195c0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
195d0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
195e0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66  PE_BTREE );.  if
195f0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
19600 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
19610 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
19620 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
19630 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
19640 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19650 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19660 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
19670 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
19680 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
19690 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
196a0 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
196b0 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
196c0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
196d0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
196e0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
196f0 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
19700 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
19710 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
19720 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
19730 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
19740 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
19750 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
19760 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
19770 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
19780 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
19790 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
197a0 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
197b0 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
197c0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
197d0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
197e0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
197f0 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
19800 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
19810 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
19820 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
19830 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
19840 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
19850 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
19860 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
19870 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
19880 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
19890 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
198a0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
198b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
198c0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
198d0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70  (VdbeCursor **pp
198e0 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20  , int *piCol){. 
198f0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d   VdbeCursor *p =
19900 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74 28 20   *pp;.  assert( 
19910 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
19920 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d  TYPE_BTREE || p-
19930 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
19940 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20 20 69  PE_PSEUDO );.  i
19950 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
19960 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
19970 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20 70 2d  iMap;.    if( p-
19980 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61  >aAltMap && (iMa
19990 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31  p = p->aAltMap[1
199a0 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20  +*piCol])>0 ){. 
199b0 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41       *pp = p->pA
199c0 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ltCursor;.      
199d0 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20  *piCol = iMap - 
199e0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
199f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19a00 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
19a10 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
19a20 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (p);.  }.  if( s
19a30 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
19a40 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
19a50 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
19a60 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
19a70 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
19a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19a90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
19aa0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
19ab0 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
19ac0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19ad0 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
19ae0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19af0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
19b00 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
19b10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19b20 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
19b30 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
19b40 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
19b50 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
19b60 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
19b70 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
19b80 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
19b90 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
19ba0 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
19bb0 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
19bc0 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
19bd0 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
19be0 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
19bf0 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
19c00 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
19c10 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
19c20 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
19c30 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
19c40 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
19c50 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
19c60 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
19c70 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
19c80 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
19c90 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
19ca0 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
19cb0 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
19cc0 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
19cd0 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
19ce0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
19cf0 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
19d00 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
19d10 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
19d20 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
19d30 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
19d40 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
19d50 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
19d60 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
19d70 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eparately..**.**
19d80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
19d90 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
19da0 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
19db0 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
19dc0 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
19dd0 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
19de0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
19df0 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
19e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
19e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
19e20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
19e30 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
19e60 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
19e90 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
19ea0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
19eb0 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
19ec0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
19ed0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
19f00 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
19f10 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
19f30 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
19f40 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
19f50 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
19f60 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
19f70 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
19f80 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
19fb0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
19fc0 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
19fe0 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
19ff0 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
1a020 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
1a030 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
1a060 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
1a070 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
1a0a0 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
1a0b0 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
1a0c0 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
1a0d0 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
1a0e0 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
1a0f0 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
1a100 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
1a110 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
1a120 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
1a130 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
1a140 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
1a150 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
1a160 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
1a170 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
1a180 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
1a190 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
1a1a0 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
1a1b0 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
1a1c0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
1a1d0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
1a1e0 75 74 69 6e 65 20 6d 69 67 68 74 20 63 6f 6e 76  utine might conv
1a1f0 65 72 74 20 61 20 6c 61 72 67 65 20 4d 45 4d 5f  ert a large MEM_
1a200 49 6e 74 52 65 61 6c 20 76 61 6c 75 65 20 69 6e  IntReal value in
1a210 74 6f 20 4d 45 4d 5f 52 65 61 6c 2e 0a 2a 2f 0a  to MEM_Real..*/.
1a220 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1a230 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
1a240 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
1a250 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29  rmat, u32 *pLen)
1a260 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
1a270 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75  pMem->flags;.  u
1a280 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  32 n;..  assert(
1a290 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66   pLen!=0 );.  if
1a2a0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
1a2b0 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
1a2c0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  0;.    return 0;
1a2d0 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
1a2e0 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e  &(MEM_Int|MEM_In
1a2f0 74 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  tReal) ){.    /*
1a300 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
1a310 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
1a320 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
1a330 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
1a340 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
1a350 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
1a360 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
1a370 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1a380 20 75 36 34 20 75 3b 0a 20 20 20 20 74 65 73 74   u64 u;.    test
1a390 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
1a3a0 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74 65 73  M_Int );.    tes
1a3b0 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1a3c0 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20  EM_IntReal );.  
1a3d0 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
1a3e0 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d     u = ~i;.    }
1a3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
1a400 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
1a410 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
1a420 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26   if( (i&1)==i &&
1a430 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
1a440 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e  ){.        *pLen
1a450 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
1a460 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20  turn 8+(u32)u;. 
1a470 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a480 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20      *pLen = 1;. 
1a490 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1a4a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a4b0 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
1a4c0 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65  ){ *pLen = 2; re
1a4d0 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66  turn 2; }.    if
1a4e0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20  ( u<=8388607 ){ 
1a4f0 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72  *pLen = 3; retur
1a500 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 3; }.    if( u
1a510 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20  <=2147483647 ){ 
1a520 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72  *pLen = 4; retur
1a530 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 4; }.    if( u
1a540 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a  <=MAX_6BYTE ){ *
1a550 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e  pLen = 6; return
1a560 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20   5; }.    *pLen 
1a570 3d 20 38 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  = 8;.    if( fla
1a580 67 73 26 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29  gs&MEM_IntReal )
1a590 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1a5a0 65 20 76 61 6c 75 65 20 69 73 20 49 6e 74 52 65  e value is IntRe
1a5b0 61 6c 20 61 6e 64 20 69 73 20 67 6f 69 6e 67 20  al and is going 
1a5c0 74 6f 20 74 61 6b 65 20 75 70 20 38 20 62 79 74  to take up 8 byt
1a5d0 65 73 20 74 6f 20 73 74 6f 72 65 0a 20 20 20 20  es to store.    
1a5e0 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65 67    ** as an integ
1a5f0 65 72 2c 20 74 68 65 6e 20 77 65 20 6d 69 67 68  er, then we migh
1a600 74 20 61 73 20 77 65 6c 6c 20 6d 61 6b 65 20 69  t as well make i
1a610 74 20 61 6e 20 38 2d 62 79 74 65 20 66 6c 6f 61  t an 8-byte floa
1a620 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 6f  ting.      ** po
1a630 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  int value */.   
1a640 20 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20 28     pMem->u.r = (
1a650 64 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e 75 2e 69  double)pMem->u.i
1a660 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1a670 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 49 6e 74 52  ags &= ~MEM_IntR
1a680 65 61 6c 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  eal;.      pMem-
1a690 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65  >flags |= MEM_Re
1a6a0 61 6c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  al;.      return
1a6b0 20 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   7;.    }.    re
1a6c0 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
1a6d0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
1a6e0 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
1a6f0 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  8;.    return 7;
1a700 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1a710 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
1a720 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
1a730 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
1a740 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a750 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e  Mem->n>=0 );.  n
1a760 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b   = (u32)pMem->n;
1a770 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
1a780 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
1a790 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
1a7a0 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d  o;.  }.  *pLen =
1a7b0 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   n;.  return ((n
1a7c0 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
1a7d0 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
1a7e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1a7f0 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20  izes for serial 
1a800 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20  types less than 
1a810 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  128.*/.static co
1a820 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d  nst u8 sqlite3Sm
1a830 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d  allTypeSizes[] =
1a840 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30   {.        /*  0
1a850 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34     1   2   3   4
1a860 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38     5   6   7   8
1a870 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20     9 */   ./*   
1a880 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32  0 */   0,  1,  2
1a890 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38  ,  3,  4,  6,  8
1a8a0 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  8,  0,  0,./*
1a8b0 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c    10 */   0,  0,
1a8c0 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
1a8d0 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c    2,  2,  3,  3,
1a8e0 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20  ./*  20 */   4, 
1a8f0 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20   4,  5,  5,  6, 
1a900 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20   6,  7,  7,  8, 
1a910 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20   8,./*  30 */   
1a920 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31  9,  9, 10, 10, 1
1a930 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31  1, 11, 12, 12, 1
1a940 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f  3, 13,./*  40 */
1a950 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35    14, 14, 15, 15
1a960 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37  , 16, 16, 17, 17
1a970 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30  , 18, 18,./*  50
1a980 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c   */  19, 19, 20,
1a990 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c   20, 21, 21, 22,
1a9a0 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20   22, 23, 23,./* 
1a9b0 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20   60 */  24, 24, 
1a9c0 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20  25, 25, 26, 26, 
1a9d0 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a  27, 27, 28, 28,.
1a9e0 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32  /*  70 */  29, 2
1a9f0 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33  9, 30, 30, 31, 3
1aa00 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33  1, 32, 32, 33, 3
1aa10 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34  3,./*  80 */  34
1aa20 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36  , 34, 35, 35, 36
1aa30 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38  , 36, 37, 37, 38
1aa40 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20  , 38,./*  90 */ 
1aa50 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c   39, 39, 40, 40,
1aa60 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c   41, 41, 42, 42,
1aa70 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20   43, 43,./* 100 
1aa80 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20  */  44, 44, 45, 
1aa90 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20  45, 46, 46, 47, 
1aaa0 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31  47, 48, 48,./* 1
1aab0 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35  10 */  49, 49, 5
1aac0 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35  0, 50, 51, 51, 5
1aad0 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f  2, 52, 53, 53,./
1aae0 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34  * 120 */  54, 54
1aaf0 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36  , 55, 55, 56, 56
1ab00 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a  , 57, 57.};../*.
1ab10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
1ab20 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
1ab30 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1ab40 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
1ab50 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
1ab60 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1ab70 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
1ab80 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
1ab90 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1aba0 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75  =128 ){.    retu
1abb0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
1abc0 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
1abd0 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69      assert( seri
1abe0 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20  al_type<12 .    
1abf0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
1ac00 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
1ac10 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28  [serial_type]==(
1ac20 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1ac30 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72  )/2 );.    retur
1ac40 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
1ac50 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
1ac60 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73  ype];.  }.}.u8 s
1ac70 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74  qlite3VdbeOneByt
1ac80 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
1ac90 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  8 serial_type){.
1aca0 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
1acb0 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72  _type<128 );.  r
1acc0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
1acd0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1ace0 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f  al_type];  .}../
1acf0 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
1ad00 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
1ad10 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
1ad20 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
1ad30 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
1ad40 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
1ad50 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
1ad60 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
1ad70 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
1ad80 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
1ad90 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
1ada0 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
1adb0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
1adc0 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
1add0 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
1ade0 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
1adf0 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
1ae00 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
1ae10 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
1ae20 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
1ae30 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
1ae40 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
1ae50 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
1ae60 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
1ae70 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
1ae80 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
1ae90 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
1aea0 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
1aeb0 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
1aec0 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
1aed0 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
1aee0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1aef0 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
1af00 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
1af10 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
1af20 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
1af30 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
1af40 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
1af50 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
1af60 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
1af70 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
1af80 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
1af90 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
1afa0 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
1afb0 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
1afc0 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
1afd0 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
1afe0 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
1aff0 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
1b000 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
1b010 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
1b020 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
1b030 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
1b040 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
1b050 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
1b060 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
1b070 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
1b080 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
1b090 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
1b0a0 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
1b0b0 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
1b0c0 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
1b0d0 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
1b0e0 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
1b0f0 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
1b100 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
1b110 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
1b120 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
1b130 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
1b140 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
1b150 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
1b160 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
1b170 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
1b180 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
1b190 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
1b1a0 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
1b1b0 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
1b1c0 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
1b1d0 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
1b1e0 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
1b1f0 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
1b200 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
1b210 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
1b220 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
1b230 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
1b240 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
1b250 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
1b260 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
1b270 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
1b280 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
1b290 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
1b2a0 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
1b2b0 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
1b2c0 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
1b2d0 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
1b2e0 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
1b2f0 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
1b300 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
1b310 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
1b320 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
1b330 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
1b340 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
1b350 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
1b360 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
1b370 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
1b380 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
1b390 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
1b3a0 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
1b3b0 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
1b3c0 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
1b3d0 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
1b3e0 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
1b3f0 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
1b400 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
1b410 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
1b420 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
1b430 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
1b440 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
1b450 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
1b460 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
1b470 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1b480 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
1b490 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
1b4a0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
1b4b0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
1b4c0 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
1b4d0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
1b4e0 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
1b4f0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1b500 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1b510 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
1b520 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
1b530 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1b540 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
1b550 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
1b560 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
1b570 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
1b580 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
1b590 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1b5a0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
1b5b0 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
1b5c0 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
1b5d0 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
1b5e0 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
1b5f0 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
1b600 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
1b610 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
1b620 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1b630 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1b640 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
1b650 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
1b660 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
1b670 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
1b680 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
1b690 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
1b6a0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
1b6b0 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
1b6c0 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
1b6d0 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
1b6e0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1b6f0 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
1b700 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
1b710 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
1b720 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
1b730 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
1b740 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
1b750 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
1b760 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
1b770 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
1b780 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
1b790 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1b7a0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
1b7b0 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
1b7c0 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
1b7d0 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
1b7e0 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
1b7f0 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
1b800 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
1b810 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b820 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
1b830 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
1b840 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d   = i = sqlite3Sm
1b850 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
1b860 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61  ial_type];.    a
1b870 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
1b880 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b    do{.      buf[
1b890 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  --i] = (u8)(v&0x
1b8a0 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
1b8b0 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   8;.    }while( 
1b8c0 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  i );.    return 
1b8d0 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
1b8e0 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
1b8f0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
1b900 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
1b910 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
1b920 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
1b930 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
1b940 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20  u.nZero:0).     
1b950 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29          == (int)
1b960 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b970 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1b980 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e  type) );.    len
1b990 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
1b9a0 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63  if( len>0 ) memc
1b9b0 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
1b9c0 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
1b9d0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
1b9e0 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
1b9f0 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
1ba00 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49  eturn 0;.}../* I
1ba10 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65  nput "x" is a se
1ba20 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e  quence of unsign
1ba30 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ed characters th
1ba40 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a  at represent a.*
1ba50 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  * big-endian int
1ba60 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  eger.  Return th
1ba70 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74  e equivalent nat
1ba80 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23  ive integer.*/.#
1ba90 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f  define ONE_BYTE_
1baa0 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28  INT(x)    ((i8)(
1bab0 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[0]).#define T
1bac0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  WO_BYTE_INT(x)  
1bad0 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b    (256*(i8)((x)[
1bae0 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66  0])|(x)[1]).#def
1baf0 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49  ine THREE_BYTE_I
1bb00 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69  NT(x)  (65536*(i
1bb10 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
1bb20 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23  1]<<8)|(x)[2]).#
1bb30 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
1bb40 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32  _UINT(x)  (((u32
1bb50 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78  )(x)[0]<<24)|((x
1bb60 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
1bb70 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64  ]<<8)|(x)[3]).#d
1bb80 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
1bb90 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36  INT(x) (16777216
1bba0 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
1bbb0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
1bbc0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a  2]<<8)|(x)[3])..
1bbd0 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
1bbe0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
1bbf0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
1bc00 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
1bc10 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
1bc20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1bc30 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
1bc40 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1bc50 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
1bc60 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1bc70 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1bc80 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61  ed as two separa
1bc90 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  te routines for 
1bca0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
1bcb0 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68  The few cases th
1bcc0 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c  at require local
1bcd0 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
1bce0 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61  roken out into a
1bcf0 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75   separate.** rou
1bd00 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20  tine so that in 
1bd10 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f  most cases the o
1bd20 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e  verhead of movin
1bd30 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e  g the stack poin
1bd40 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65  ter.** is avoide
1bd50 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33  d..*/ .static u3
1bd60 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  2 SQLITE_NOINLIN
1bd70 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63  E serialGet(.  c
1bd80 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1bd90 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
1bda0 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
1bdb0 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
1bdc0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bde0 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
1bdf0 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
1be00 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be20 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
1be30 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
1be40 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20  o */.){.  u64 x 
1be50 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1be60 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d  (buf);.  u32 y =
1be70 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1be80 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78  buf+4);.  x = (x
1be90 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28  <<32) + y;.  if(
1bea0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
1beb0 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
1bec0 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35  CE-OF: R-29851-5
1bed0 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20  2272 Value is a 
1bee0 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69  big-endian 64-bi
1bef0 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f  t.    ** twos-co
1bf00 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1bf10 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  . */.    pMem->u
1bf20 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
1bf30 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1bf40 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
1bf50 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1bf60 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
1bf70 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1bf80 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31  -OF: R-57343-491
1bf90 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  14 Value is a bi
1bfa0 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35  g-endian IEEE 75
1bfb0 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20  4-2008 64-bit.  
1bfc0 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
1bfd0 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23  int number. */.#
1bfe0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
1bff0 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
1c000 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1c010 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
1c020 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
1c030 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
1c040 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1c050 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
1c060 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
1c070 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
1c080 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
1c090 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
1c0a0 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64  s.    ** defined
1c0b0 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
1c0c0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
1c0d0 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
1c0e0 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61  xed.    ** endia
1c0f0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n..    */.    st
1c100 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
1c110 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
1c120 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73  0000)<<32;.    s
1c130 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
1c140 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
1c150 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
1c160 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
1c170 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
1c180 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
1c190 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
1c1a0 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
1c1b0 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
1c1c0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 );.#endif.    
1c1d0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
1c1e0 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
1c1f0 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a  Mem->u.r)==8 );.
1c200 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1c210 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
1c220 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75   memcpy(&pMem->u
1c230 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  .r, &x, sizeof(x
1c240 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ));.    pMem->fl
1c250 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
1c260 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20  aN(pMem->u.r) ? 
1c270 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
1c280 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eal;.  }.  retur
1c290 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  n 8;.}.u32 sqlit
1c2a0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1c2b0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1c2c0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
1c2d0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
1c2e0 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
1c2f0 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
1c300 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1c310 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1c320 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1c330 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c350 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
1c360 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
1c370 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
1c380 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1c390 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
1c3a0 3a 20 7b 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20  : { /* Internal 
1c3b0 75 73 65 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77  use only: NULL w
1c3c0 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
1c3d0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1c3e0 20 2a 2a 20 55 50 44 41 54 45 20 6e 6f 2d 63 68   ** UPDATE no-ch
1c3f0 61 6e 67 65 20 66 6c 61 67 20 73 65 74 20 2a 2f  ange flag set */
1c400 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1c410 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  gs = MEM_Null|ME
1c420 4d 5f 5a 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d  M_Zero;.      pM
1c430 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
1c440 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d   pMem->u.nZero =
1c450 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1c460 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c470 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
1c480 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
1c490 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
1c4a0 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20  {  /* Null */.  
1c4b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c4c0 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37  OF: R-24078-0937
1c4d0 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c  5 Value is a NUL
1c4e0 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  L. */.      pMem
1c4f0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
1c500 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
1c510 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c520 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  1: {.      /* EV
1c530 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38  IDENCE-OF: R-448
1c540 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69  85-25196 Value i
1c550 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d  s an 8-bit twos-
1c560 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20  complement.     
1c570 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
1c580 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1c590 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
1c5a0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1c5b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1c5c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c5d0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1c5e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1c5f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c600 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
1c610 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1c620 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1c630 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33  CE-OF: R-49794-3
1c640 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20  5026 Value is a 
1c650 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69  big-endian 16-bi
1c660 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1c670 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1c680 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1c690 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
1c6a0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1c6b0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1c6c0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1c6d0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1c6e0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1c6f0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1c700 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1c710 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1c720 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1c730 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c740 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75  37839-54301 Valu
1c750 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1c760 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 24-bit.      *
1c770 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1c780 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1c790 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1c7a0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
1c7b0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1c7c0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1c7d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c7e0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1c7f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
1c800 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c810 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
1c820 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1c830 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1c840 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32  CE-OF: R-01849-2
1c850 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20  6079 Value is a 
1c860 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69  big-endian 32-bi
1c870 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1c880 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1c890 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1c8a0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
1c8b0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66  TE_INT(buf);.#if
1c8c0 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20  def __HP_cc .   
1c8d0 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e     /* Work aroun
1c8e0 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69  d a sign-extensi
1c8f0 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50  on bug in the HP
1c900 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50   compiler for HP
1c910 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  /UX */.      if(
1c920 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70   buf[0]&0x80 ) p
1c930 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66  Mem->u.i |= 0xff
1c940 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c  ffffff80000000LL
1c950 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
1c960 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1c970 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1c980 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1c990 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1c9a0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
1c9b0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1c9c0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c9d0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1c9e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33  IDENCE-OF: R-503
1c9f0 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69  85-09674 Value i
1ca00 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34  s a big-endian 4
1ca10 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  8-bit.      ** t
1ca20 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1ca30 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1ca40 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
1ca50 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
1ca60 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1ca70 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1ca80 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1ca90 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1caa0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1cab0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1cac0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1cad0 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
1cae0 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
1caf0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1cb00 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
1cb10 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
1cb20 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
1cb30 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f   /* These use lo
1cb40 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73  cal variables, s
1cb50 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73  o do them in a s
1cb60 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a  eparate routine.
1cb70 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
1cb80 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65  d having to move
1cb90 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74   the frame point
1cba0 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  er in the common
1cbb0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72   case */.      r
1cbc0 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28  eturn serialGet(
1cbd0 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c  buf,serial_type,
1cbe0 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
1cbf0 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
1cc00 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
1cc10 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
1cc20 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
1cc30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1cc40 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56   R-12976-22893 V
1cc50 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
1cc60 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 0. */.      
1cc70 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1cc80 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61  R-18143-12121 Va
1cc90 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1cca0 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70  er 1. */.      p
1ccb0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
1ccc0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
1ccd0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1cce0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
1ccf0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1cd00 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1cd10 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1cd20 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20  : R-14606-31564 
1cd30 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20  Value is a BLOB 
1cd40 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32  that is (N-12)/2
1cd50 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20   bytes in.      
1cd60 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20  ** length..     
1cd70 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
1cd80 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56   R-28401-00140 V
1cd90 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1cda0 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63   in the text enc
1cdb0 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  oding and.      
1cdc0 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65  ** (N-13)/2 byte
1cdd0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a  s in length. */.
1cde0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
1cdf0 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
1ce00 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
1ce10 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
1ce20 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
1ce30 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
1ce40 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
1ce50 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
1ce60 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
1ce70 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1ce80 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
1ce90 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
1cea0 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
1ceb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1cec0 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
1ced0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1cee0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
1cef0 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
1cf00 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
1cf10 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
1cf20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1cf30 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
1cf40 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1cf50 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
1cf60 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1cf70 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1cf80 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1cf90 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
1cfa0 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
1cfb0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
1cfc0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
1cfd0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
1cfe0 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
1cff0 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
1d000 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
1d010 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
1d020 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
1d030 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
1d040 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
1d050 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
1d060 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
1d070 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
1d080 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
1d090 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
1d0a0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
1d0b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
1d0c0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
1d0d0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
1d0e0 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
1d0f0 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
1d100 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1d110 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
1d120 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1d130 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
1d140 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
1d150 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d160 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1d170 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
1d180 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
1d190 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1d1a0 6e 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  nfo             
1d1b0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1d1c0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
1d1d0 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
1d1e0 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
1d1f0 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
1d200 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
1d210 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  urn */.  int nBy
1d220 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1d230 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d240 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
1d250 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20  ired for *p */. 
1d260 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
1d270 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
1d280 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
1d290 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
1d2a0 3e 6e 4b 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20  >nKeyField+1);. 
1d2b0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
1d2c0 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
1d2d0 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
1d2e0 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
1d2f0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1d300 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  n 0;.  p->aMem =
1d310 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1d320 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1d330 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1d340 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1d350 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1d360 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1d370 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1d380 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1d390 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
1d3a0 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75  ield + 1;.  retu
1d3b0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1d3c0 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
1d3d0 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
1d3e0 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
1d3f0 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ], populate the 
1d400 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  .** UnpackedReco
1d410 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  rd structure ind
1d420 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f  icated by the fo
1d430 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69  urth argument wi
1d440 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  th the.** conten
1d450 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65  ts of the decode
1d460 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f  d record..*/ .vo
1d470 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1d480 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
1d490 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1d4a0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1d4b0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
1d4c0 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
1d4d0 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
1d4e0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d4f0 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
1d500 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
1d510 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1d520 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
1d530 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
1d540 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20  kedRecord *p    
1d550 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1d560 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66  is structure bef
1d570 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
1d580 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
1d590 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1d5a0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1d5b0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
1d5c0 20 20 75 33 32 20 64 3b 20 0a 20 20 75 33 32 20    u32 d; .  u32 
1d5d0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d5f0 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20  ffset in aKey[] 
1d600 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1d610 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1d640 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d650 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
1d660 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *pMem = p->aMem
1d670 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f  ;..  p->default_
1d680 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
1d690 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1d6a0 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
1d6b0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1d6c0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1d6d0 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
1d6e0 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
1d6f0 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c   idx<szHdr && d<
1d700 3d 28 75 33 32 29 6e 4b 65 79 20 29 7b 0a 20 20  =(u32)nKey ){.  
1d710 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1d720 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
1d730 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1d740 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
1d750 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
1d760 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1d770 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
1d780 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1d790 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
1d7a0 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
1d7b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1d7c0 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
1d7d0 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
1d7e0 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  Mem->szMalloc = 
1d7f0 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  0;.    pMem->z =
1d800 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
1d810 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1d820 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
1d830 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
1d840 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
1d850 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46  if( (++u)>=p->nF
1d860 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  ield ) break;.  
1d870 7d 0a 20 20 69 66 28 20 64 3e 28 75 33 32 29 6e  }.  if( d>(u32)n
1d880 4b 65 79 20 26 26 20 75 20 29 7b 0a 20 20 20 20  Key && u ){.    
1d890 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1d8a0 44 42 20 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 20  DB );.    /* In 
1d8b0 61 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72 64  a corrupt record
1d8c0 20 65 6e 74 72 79 2c 20 74 68 65 20 6c 61 73 74   entry, the last
1d8d0 20 70 4d 65 6d 20 6d 69 67 68 74 20 68 61 76 65   pMem might have
1d8e0 20 62 65 65 6e 20 73 65 74 20 75 70 20 75 73 69   been set up usi
1d8f0 6e 67 20 0a 20 20 20 20 2a 2a 20 75 6e 69 6e 69  ng .    ** unini
1d900 74 69 61 6c 69 7a 65 64 20 6d 65 6d 6f 72 79 2e  tialized memory.
1d910 20 4f 76 65 72 77 72 69 74 65 20 69 74 73 20 76   Overwrite its v
1d920 61 6c 75 65 20 77 69 74 68 20 4e 55 4c 4c 2c 20  alue with NULL, 
1d930 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 2a  to prevent.    *
1d940 2a 20 77 61 72 6e 69 6e 67 73 20 66 72 6f 6d 20  * warnings from 
1d950 4d 53 41 4e 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  MSAN. */.    sql
1d960 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
1d970 6c 6c 28 70 4d 65 6d 2d 31 29 3b 0a 20 20 7d 0a  ll(pMem-1);.  }.
1d980 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
1d990 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
1d9a0 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
1d9b0 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64  eld = u;.}..#ifd
1d9c0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d9d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d9e0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f  ion compares two
1d9f0 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
1da00 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74  record keys in t
1da10 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61  he same way.** a
1da20 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  s the sqlite3Vdb
1da30 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1da40 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65   routine. Unlike
1da50 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
1da60 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  re(),.** this fu
1da70 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
1da80 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73  zes and compares
1da90 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68   values using th
1daa0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  e.** sqlite3Vdbe
1dab0 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20  SerialGet() and 
1dac0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1dad0 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49  e() functions. I
1dae0 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20  t is used.** in 
1daf0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1db00 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
1db10 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64  at the optimized
1db20 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69   code in.** sqli
1db30 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1db40 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72  pare() returns r
1db50 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73  esults with thes
1db60 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73  e two primitives
1db70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
1db80 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  rue if the resul
1db90 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
1dba0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1dbb0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a   desiredResult..
1dbc0 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1dbd0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
1dbe0 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  sagreement..*/.s
1dbf0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1dc00 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1dc10 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1dc20 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1dc30 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1dc40 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65  .  const Unpacke
1dc50 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1dc60 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1dc70 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65  .  int desiredRe
1dc80 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
1dc90 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77   /* Correct answ
1dca0 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  er */.){.  u32 d
1dcb0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1dcc0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1dcd0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1dce0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
1dcf0 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1dd00 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1dd10 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
1dd20 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
1dd30 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1dd40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dd50 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
1dd60 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
1dd70 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
1dd80 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1dd90 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1dda0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1ddb0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1ddc0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1ddd0 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
1dde0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
1ddf0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1de00 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1de10 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1de20 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
1de30 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
1de40 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1de50 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
1de60 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
1de70 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
1de80 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
1de90 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
1dea0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1deb0 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1dec0 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1ded0 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1dee0 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
1def0 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
1df00 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
1df10 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
1df20 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
1df30 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
1df40 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
1df50 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
1df60 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
1df70 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
1df80 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
1df90 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
1dfa0 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
1dfb0 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  sed uninitialize
1dfc0 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20  d, and doing .  
1dfd0 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61  ** the unnecessa
1dfe0 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ry initializatio
1dff0 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62  n has a measurab
1e000 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66  le negative perf
1e010 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70  ormance.  ** imp
1e020 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20  act, since this 
1e030 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72  routine is a ver
1e040 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20  y high runner.  
1e050 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73  And so, we choos
1e060 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  e.  ** to ignore
1e070 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61   the compiler wa
1e080 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65  rnings and leave
1e090 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75   this variable u
1e0a0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1e0b0 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e  */.  /*  mem1.u.
1e0c0 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e  i = 0;  // not n
1e0d0 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73  eeded, here to s
1e0e0 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20  ilence compiler 
1e0f0 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20  warning */.  .  
1e100 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1e110 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1e120 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e  );.  if( szHdr1>
1e130 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53  98307 ) return S
1e140 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
1e150 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
1e160 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1e170 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b  ->nAllField>=pPK
1e180 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43  ey2->nField || C
1e190 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1e1a0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1e1b0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1e1c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1e1d0 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e  Info->nKeyField>
1e1e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1e1f0 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1e200 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1e210 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1e220 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1e230 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1e240 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1e250 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1e260 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1e270 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1e280 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1e290 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1e2a0 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1e2b0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1e2c0 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1e2d0 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1e2e0 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1e2f0 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1e300 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1e310 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1e320 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1e330 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1e340 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1e350 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1e360 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1e370 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1e380 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1e390 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1e3a0 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1e3b0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1e3c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1e3d0 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1e3e0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1e3f0 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 28 75  */.    if( d1+(u
1e400 36 34 29 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  64)serial_type1+
1e410 32 3e 28 75 36 34 29 6e 4b 65 79 31 0a 20 20 20  2>(u64)nKey1.   
1e420 20 20 26 26 20 64 31 2b 28 75 36 34 29 73 71 6c    && d1+(u64)sql
1e430 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1e440 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1e450 65 31 29 3e 28 75 36 34 29 6e 4b 65 79 31 20 0a  e1)>(u64)nKey1 .
1e460 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
1e470 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1e480 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1e490 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
1e4a0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1e4b0 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1e4c0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1e4d0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1e4e0 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
1e4f0 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
1e500 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
1e510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
1e520 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
1e530 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
1e540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
1e560 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1e570 3e 69 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  >i ? pKeyInfo->a
1e580 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
1e590 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1e5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1e5b0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1e5c0 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1e5d0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1e5e0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1e5f0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1e600 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1e610 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
1e620 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20  result for DESC 
1e630 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
1e640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1e650 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  o debugCompareEn
1e660 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  d;.    }.    i++
1e670 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1e680 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
1e690 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
1e6a0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1e6b0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1e6c0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1e6d0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1e6e0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1e6f0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1e700 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1e710 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1e720 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1e730 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1e740 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1e750 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1e760 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
1e770 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1e780 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1e790 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1e7a0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
1e7b0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1e7c0 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1e7d0 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1e7e0 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1e7f0 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1e800 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1e810 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1e820 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79   */.  rc = pPKey
1e830 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a  2->default_rc;..
1e840 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a  debugCompareEnd:
1e850 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1e860 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30  sult==0 && rc==0
1e870 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1e880 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1e890 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74  <0 && rc<0 ) ret
1e8a0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1e8b0 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20  iredResult>0 && 
1e8c0 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc>0 ) return 1;
1e8d0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1e8e0 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
1e8f0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1e900 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e910 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1e920 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1e930 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1e940 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  EBUG./*.** Count
1e950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1e960 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f  ields (a.k.a. co
1e970 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65  lumns) in the re
1e980 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a  cord given by.**
1e990 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65   pKey,nKey.  The
1e9a0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1e9b0 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20  s count is less 
1e9c0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1e9d0 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69   the.** limit gi
1e9e0 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d  ven by pKeyInfo-
1e9f0 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a  >nAllField..**.*
1ea00 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72  * If this constr
1ea10 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69  aint is not sati
1ea20 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20  sfied, it means 
1ea30 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70  that the high-sp
1ea40 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72  eed.** vdbeRecor
1ea50 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1ea60 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  d vdbeRecordComp
1ea70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74  areString() rout
1ea80 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  ines will.** not
1ea90 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1eaa0 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74    If this assert
1eab0 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69  () ever fires, i
1eac0 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73  t probably means
1ead0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79  .** that the Key
1eae0 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 6f  Info.nKeyField o
1eaf0 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69  r KeyInfo.nAllFi
1eb00 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1eb10 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1eb20 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1eb30 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1eb40 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1eb50 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1eb60 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1eb70 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1eb80 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1eb90 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1eba0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1ebb0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1ebc0 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1ebd0 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1ebe0 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1ebf0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1ec00 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1ec10 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1ec20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1ec30 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1ec40 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1ec50 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1ec60 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1ec70 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1ec80 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1ec90 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1eca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1ecb0 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1ecc0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1ecd0 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1ece0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1ecf0 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1ed00 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1ed10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1ed20 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1ed30 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b 0a  o->nAllField );.
1ed40 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1ed50 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1ed60 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1ed70 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a  s(A,B,C).#endif.
1ed80 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
1ed90 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
1eda0 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
1edb0 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
1edc0 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
1edd0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1ede0 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
1edf0 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
1ee00 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
1ee10 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1ee20 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
1ee30 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1ee40 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
1ee50 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
1ee60 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
1ee70 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
1ee80 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
1ee90 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
1eea0 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
1eeb0 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
1eec0 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
1eed0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
1eee0 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1eef0 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
1ef00 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38  Seq *pColl,.  u8
1ef10 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20   *prcErr        
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef30 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
1ef40 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  s, set to SQLITE
1ef50 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69  _NOMEM */.){.  i
1ef60 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
1ef70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
1ef80 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
1ef90 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1efa0 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
1efb0 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
1efc0 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
1efd0 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
1efe0 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
1eff0 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
1f000 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
1f010 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
1f020 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
1f030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1f040 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
1f050 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
1f060 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
1f070 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  em c2;.    sqlit
1f080 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1f090 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  1, pMem1->db, ME
1f0a0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1f0b0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1f0c0 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c2, pMem1->db, 
1f0d0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1f0e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1f0f0 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
1f100 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
1f110 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f120 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1f130 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
1f140 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
1f150 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1f160 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1f170 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
1f180 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  );.    v2 = sqli
1f190 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1f1a0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
1f1b0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1f1c0 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c     if( (v1==0 ||
1f1d0 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20   v2==0) ){.     
1f1e0 20 69 66 28 20 70 72 63 45 72 72 20 29 20 2a 70   if( prcErr ) *p
1f1f0 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e  rcErr = SQLITE_N
1f200 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
1f210 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c   rc = 0;.    }el
1f220 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1f230 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1f240 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76  ->pUser, c1.n, v
1f250 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20  1, c2.n, v2);.  
1f260 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1f270 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1f280 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1f290 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1f2a0 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  2);.    return r
1f2b0 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1f2c0 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20  The input pBlob 
1f2d0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1f2e0 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20   be a Blob that 
1f2f0 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a  is not marked.**
1f300 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20   with MEM_Zero. 
1f310 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1f320 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65  it could be a ze
1f330 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74  ro-blob..*/.stat
1f340 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f  ic int isAllZero
1f350 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1f360 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
1f370 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
1f380 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
1f390 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [i] ) return 0;.
1f3a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1f3b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1f3c0 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1f3d0 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1f3e0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1f3f0 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1f400 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1f410 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1f420 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1f430 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1f440 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1f450 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1f460 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1f470 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1f480 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51  he lessor..*/.SQ
1f490 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
1f4a0 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  t sqlite3BlobCom
1f4b0 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1f4c0 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  pB1, const Mem *
1f4d0 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  pB2){.  int c;. 
1f4e0 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e   int n1 = pB1->n
1f4f0 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32  ;.  int n2 = pB2
1f500 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  ->n;..  /* It is
1f510 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
1f520 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74  e a Blob value t
1f530 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e  hat has some non
1f540 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20  -zero content.  
1f550 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  ** followed by z
1f560 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75  ero content.  Bu
1f570 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65  t that only come
1f580 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66  s up for Blobs f
1f590 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ormed.  ** by th
1f5a0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1f5b0 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68  opcode, and such
1f5c0 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74   Blobs never get
1f5d0 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
1f5e0 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  * sqlite3MemComp
1f5f0 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  are(). */.  asse
1f600 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20  rt( (pB1->flags 
1f610 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1f620 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73  | n1==0 );.  ass
1f630 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73  ert( (pB2->flags
1f640 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1f650 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69  || n2==0 );..  i
1f660 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70  f( (pB1->flags|p
1f670 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  B2->flags) & MEM
1f680 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28  _Zero ){.    if(
1f690 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42   pB1->flags & pB
1f6a0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1f6b0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ero ){.      ret
1f6c0 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1f6d0 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1f6e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1f6f0 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1f700 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
1f710 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32  ( !isAllZero(pB2
1f720 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72  ->z, pB2->n) ) r
1f730 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1f740 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a  return pB1->u.nZ
1f750 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65  ero - n2;.    }e
1f760 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
1f770 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a  isAllZero(pB1->z
1f780 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75  , pB1->n) ) retu
1f790 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1f7a0 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e  urn n1 - pB2->u.
1f7b0 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  nZero;.    }.  }
1f7c0 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  .  c = memcmp(pB
1f7d0 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31  1->z, pB2->z, n1
1f7e0 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a  >n2 ? n2 : n1);.
1f7f0 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1f800 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20   c;.  return n1 
1f810 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  - n2;.}../*.** D
1f820 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1f830 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1f840 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1f850 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1f860 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1f870 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1f880 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1f890 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1f8a0 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1f8b0 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1f8c0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1f8d0 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1f8e0 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1f8f0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1f900 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1f910 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1f920 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1f930 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1f940 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1f950 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1f960 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1f970 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1f980 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1f990 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1f9a0 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1f9b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1f9c0 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1f9d0 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1f9e0 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1f9f0 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1fa00 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 39 32  1;.    if( r>=92
1fa10 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
1fa20 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  8.0 ) return -1;
1fa30 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b  .    y = (i64)r;
1fa40 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72  .    if( i<y ) r
1fa50 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1fa60 28 20 69 3e 79 20 29 20 72 65 74 75 72 6e 20 2b  ( i>y ) return +
1fa70 31 3b 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62  1;.    s = (doub
1fa80 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c  le)i;.    if( s<
1fa90 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1faa0 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74     if( s>r ) ret
1fab0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75  urn +1;.    retu
1fac0 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
1fad0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1fae0 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1faf0 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1fb00 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1fb10 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1fb20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1fb30 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1fb40 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1fb50 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1fb60 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1fb70 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1fb80 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1fb90 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1fba0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1fbb0 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1fbc0 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1fbd0 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1fbe0 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1fbf0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1fc00 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1fc10 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1fc20 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1fc30 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1fc40 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1fc50 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1fc60 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1fc70 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1fc80 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1fc90 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1fca0 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1fcb0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1fcc0 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1fcd0 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1fce0 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1fcf0 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1fd00 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1fd10 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1fd20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1fd30 74 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d  t( !sqlite3VdbeM
1fd40 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 31  emIsRowSet(pMem1
1fd50 29 20 26 26 20 21 73 71 6c 69 74 65 33 56 64 62  ) && !sqlite3Vdb
1fd60 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65  eMemIsRowSet(pMe
1fd70 6d 32 29 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  m2) );. .  /* If
1fd80 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1fd90 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1fda0 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1fdb0 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1fdc0 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1fdd0 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1fde0 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1fdf0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1fe00 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1fe10 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1fe20 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1fe30 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   At least one of
1fe40 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20   the two values 
1fe50 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f  is a number.  */
1fe60 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1fe70 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  flags&(MEM_Int|M
1fe80 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52  EM_Real|MEM_IntR
1fe90 65 61 6c 29 20 29 7b 0a 20 20 20 20 74 65 73 74  eal) ){.    test
1fea0 63 61 73 65 28 20 63 6f 6d 62 69 6e 65 64 5f 66  case( combined_f
1feb0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1fec0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fed0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26  combined_flags &
1fee0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
1fef0 20 74 65 73 74 63 61 73 65 28 20 63 6f 6d 62 69   testcase( combi
1ff00 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ned_flags & MEM_
1ff10 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 69  IntReal );.    i
1ff20 66 28 20 28 66 31 20 26 20 66 32 20 26 20 28 4d  f( (f1 & f2 & (M
1ff30 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65  EM_Int|MEM_IntRe
1ff40 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  al))!=0 ){.     
1ff50 20 74 65 73 74 63 61 73 65 28 20 66 31 20 26 20   testcase( f1 & 
1ff60 66 32 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  f2 & MEM_Int );.
1ff70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ff80 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1ff90 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69  tReal );.      i
1ffa0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1ffb0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1ffc0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1ffd0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1ffe0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1fff0 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
20000 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
20010 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
20020 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
20030 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
20040 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r < pMem2->u.
20050 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
20060 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
20070 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r > pMem2->u.r
20080 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
20090 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
200a0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
200b0 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74  (MEM_Int|MEM_Int
200c0 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20  Real))!=0 ){.   
200d0 20 20 20 74 65 73 74 63 61 73 65 28 20 66 31 20     testcase( f1 
200e0 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20  & MEM_Int );.   
200f0 20 20 20 74 65 73 74 63 61 73 65 28 20 66 31 20     testcase( f1 
20100 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b  & MEM_IntReal );
20110 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
20120 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
20130 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
20140 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
20150 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c  pare(pMem1->u.i,
20160 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20   pMem2->u.r);.  
20170 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
20180 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49  2&(MEM_Int|MEM_I
20190 6e 74 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20  ntReal))!=0 ){. 
201a0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31         if( pMem1
201b0 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.i < pMem2->u
201c0 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .i ) return -1;.
201d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
201e0 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
201f0 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.i ) return +1;
20200 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20210 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
20220 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
20230 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
20240 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
20250 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
20260 20 20 20 69 66 28 20 28 66 32 26 28 4d 45 4d 5f     if( (f2&(MEM_
20270 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29  Int|MEM_IntReal)
20280 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
20290 74 65 73 74 63 61 73 65 28 20 66 32 20 26 20 4d  testcase( f2 & M
202a0 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  EM_Int );.      
202b0 20 20 74 65 73 74 63 61 73 65 28 20 66 32 20 26    testcase( f2 &
202c0 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a   MEM_IntReal );.
202d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
202e0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
202f0 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e  ompare(pMem2->u.
20300 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a  i, pMem1->u.r);.
20310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20320 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
20330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20340 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d    return +1;.  }
20350 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
20360 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
20370 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
20380 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72   a blob, the str
20390 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ing is less..  *
203a0 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74  * If both are st
203b0 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75  rings, compare u
203c0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
203d0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  ng functions..  
203e0 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
203f0 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  d_flags&MEM_Str 
20400 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
20410 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
20420 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
20430 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
20440 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  2 & MEM_Str)==0 
20450 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20460 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  -1;.    }..    a
20470 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
20480 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c  c==pMem2->enc ||
20490 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c   pMem1->db->mall
204a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
204b0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
204c0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
204d0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
204e0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
204f0 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
20500 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
20510 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
20520 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
20530 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
20540 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
20550 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
20560 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
20570 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
20580 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
20590 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
205a0 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
205b0 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
205c0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
205d0 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
205e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
205f0 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
20600 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
20610 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
20620 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
20630 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
20640 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
20650 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
20660 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
20670 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
20680 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
20690 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
206a0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
206b0 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
206c0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
206d0 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
206e0 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
206f0 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
20700 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
20710 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
20720 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
20730 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
20740 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
20750 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
20760 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
20770 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
20780 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
20790 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
207a0 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
207b0 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
207c0 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
207d0 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
207e0 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
207f0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
20800 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
20810 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
20820 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
20830 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
20840 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
20850 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
20860 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
20870 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
20880 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
20890 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
208a0 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
208b0 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
208c0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
208d0 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
208e0 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
208f0 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
20900 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
20910 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
20920 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
20930 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
20940 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
20950 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
20960 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
20970 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
20980 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
20990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
209a0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
209b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
209c0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
209d0 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
209e0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
209f0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
20a00 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
20a10 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20a20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
20a30 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
20a40 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
20a50 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
20a60 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
20a70 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
20a80 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
20a90 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
20aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
20ab0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
20ac0 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
20ad0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
20ae0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
20af0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
20b00 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
20b10 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
20b20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
20b30 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
20b40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
20b50 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
20b60 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
20b70 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
20b80 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
20b90 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
20ba0 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
20bb0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
20bc0 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
20bd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20be0 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
20bf0 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
20c00 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
20c10 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
20c20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
20c30 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
20c40 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
20c50 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
20c60 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
20c70 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
20c80 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
20c90 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
20ca0 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
20cb0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
20cc0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
20cd0 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
20ce0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
20cf0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
20d00 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
20d10 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
20d20 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
20d30 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
20d40 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
20d50 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
20d60 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
20d70 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
20d80 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
20d90 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
20da0 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
20db0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
20dc0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20dd0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
20de0 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
20df0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
20e00 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
20e10 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
20e20 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
20e30 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
20e40 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
20e50 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
20e60 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
20e70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
20e80 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
20e90 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
20ea0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
20eb0 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
20ec0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
20ed0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
20ee0 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
20ef0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
20f00 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
20f10 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
20f20 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
20f30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
20f40 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
20f50 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
20f60 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
20f70 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
20f80 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
20f90 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
20fa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
20fb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
20fc0 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
20fd0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
20fe0 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
20ff0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
21000 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
21010 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
21020 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
21030 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
21040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21050 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
21060 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
21070 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21090 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
210a0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
210b0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
210c0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
210f0 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
21100 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
21110 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
21120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21130 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
21140 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
21150 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
21180 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
21190 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
211a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
211b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
211c0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
211d0 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
211e0 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
211f0 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
21200 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
21210 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
21220 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73  pKeyInfo;.  cons
21230 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
21240 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
21250 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
21260 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d  pKey1;.  Mem mem
21270 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69  1;..  /* If bSki
21280 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  p is true, then 
21290 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
212a0 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65  lready determine
212b0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
212c0 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e  .  ** two elemen
212d0 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61  ts in the keys a
212e0 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68  re equal. Fix th
212f0 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20  e various stack 
21300 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a  variables so.  *
21310 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  * that this rout
21320 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61  ine begins compa
21330 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ring at the seco
21340 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69  nd field. */.  i
21350 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( bSkip ){.    
21360 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31  u32 s1;.    idx1
21370 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74   = 1 + getVarint
21380 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31  32(&aKey1[1], s1
21390 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20  );.    szHdr1 = 
213a0 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31  aKey1[0];.    d1
213b0 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69   = szHdr1 + sqli
213c0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
213d0 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20  eLen(s1);.    i 
213e0 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  = 1;.    pRhs++;
213f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
21400 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
21410 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
21420 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
21430 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  ;.    i = 0;.  }
21440 0a 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67  .  if( d1>(unsig
21450 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20  ned)nKey1 ){ .  
21460 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
21470 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
21480 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21490 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
214a0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 7d  orruption */.  }
214b0 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
214c0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
214d0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
214e0 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
214f0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73  atements */.  as
21500 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
21510 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
21520 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
21530 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
21540 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
21550 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
21560 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
21570 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
21580 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
21590 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20  fo->nKeyField>0 
215a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
215b0 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
215c0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
215d0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
215e0 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
215f0 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
21600 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
21610 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e  >flags & (MEM_In
21620 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29  t|MEM_IntReal) )
21630 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
21640 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
21650 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20  MEM_Int );.     
21660 20 74 65 73 74 63 61 73 65 28 20 70 52 68 73 2d   testcase( pRhs-
21670 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
21680 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 73 65  Real );.      se
21690 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
216a0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74  1[idx1];.      t
216b0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
216c0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
216d0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
216e0 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
216f0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
21700 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
21710 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
21720 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
21730 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
21740 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
21750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21760 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
21770 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
21780 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
21790 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74       rc = -sqlit
217a0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
217b0 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d  e(pRhs->u.i, mem
217c0 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  1.u.r);.      }e
217d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
217e0 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72   lhs = vdbeRecor
217f0 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61  dDecodeInt(seria
21800 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64  l_type, &aKey1[d
21810 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34  1]);.        i64
21820 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69   rhs = pRhs->u.i
21830 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68  ;.        if( lh
21840 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s<rhs ){.       
21850 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
21860 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68      }else if( lh
21870 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s>rhs ){.       
21880 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
21890 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
218a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
218b0 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65  is real */.    e
218c0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
218d0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
218e0 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
218f0 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
21900 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  ];.      if( ser
21910 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
21920 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
21930 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72  l types 12 or gr
21940 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67  eater are string
21950 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65  s and blobs (gre
21960 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  ater than.      
21970 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54    ** numbers). T
21980 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61  ypes 10 and 11 a
21990 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65  re currently "re
219a0 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
219b0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  e .        ** us
219c0 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  e", so it doesn'
219d0 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20  t really matter 
219e0 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  what the results
219f0 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20   of comparing.  
21a00 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f        ** them to
21a10 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73   numberic values
21a20 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20   are.  */.      
21a30 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
21a40 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
21a50 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
21a60 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
21a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
21a90 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
21aa0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
21ab0 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
21ac0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21ad0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==7 ){.         
21ae0 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52   if( mem1.u.r<pR
21af0 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
21b00 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
21b10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
21b20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68  if( mem1.u.r>pRh
21b30 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20  s->u.r ){.      
21b40 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
21b50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21b70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21b80 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
21b90 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e  mem1.u.i, pRhs->
21ba0 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  u.r);.        }.
21bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21bc0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
21bd0 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
21be0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
21bf0 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
21c00 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
21c10 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
21c20 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
21c30 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
21c40 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
21c50 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
21c60 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
21c70 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
21c80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
21c90 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
21ca0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
21cb0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
21cc0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
21cd0 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
21ce0 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
21cf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
21d00 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
21d10 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
21d20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21d30 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
21d40 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
21d50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
21d60 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
21d70 73 69 67 6e 65 64 29 6e 4b 65 79 31 0a 20 20 20  signed)nKey1.   
21d80 20 20 20 20 20 20 7c 7c 20 28 70 4b 65 79 49 6e        || (pKeyIn
21d90 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
21da0 79 49 6e 66 6f 29 2d 3e 6e 41 6c 6c 46 69 65 6c  yInfo)->nAllFiel
21db0 64 3c 3d 69 0a 20 20 20 20 20 20 20 20 29 7b 0a  d<=i.        ){.
21dc0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
21dd0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
21de0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21df0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
21e00 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21e10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
21e20 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
21e30 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
21e40 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
21e50 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
21e60 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
21e70 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  enc;.          m
21e80 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
21e90 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  o->db;.         
21ea0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45   mem1.flags = ME
21eb0 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20  M_Str;.         
21ec0 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a   mem1.z = (char*
21ed0 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20  )&aKey1[d1];.   
21ee0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
21ef0 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
21f00 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
21f10 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65  &mem1, pRhs, pKe
21f20 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c  yInfo->aColl[i],
21f30 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64   &pPKey2->errCod
21f40 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
21f50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21f60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
21f70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70   = MIN(mem1.n, p
21f80 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
21f90 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
21fa0 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
21fb0 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
21fc0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
21fd0 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70   rc = mem1.n - p
21fe0 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20  Rhs->n; .       
21ff0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
22000 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
22010 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c  a blob */.    el
22020 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
22030 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b  gs & MEM_Blob ){
22040 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
22050 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
22060 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52  M_Zero)==0 || pR
22070 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  hs->n==0 );.    
22080 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
22090 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
220a0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
220b0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
220c0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
220d0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
220e0 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c  pe<12 || (serial
220f0 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
22100 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
22110 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22120 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20         int nStr 
22130 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
22140 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
22150 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
22160 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64  nStr)==(unsigned
22170 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
22180 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
22190 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  nStr+1)==(unsign
221a0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
221b0 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72      if( (d1+nStr
221c0 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
221d0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
221e0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
221f0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
22200 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22210 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22230 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
22240 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
22250 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
22260 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
22270 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c        if( !isAll
22280 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 72  Zero((const char
22290 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74  *)&aKey1[d1],nSt
222a0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
222b0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
222c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
222d0 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74 72         rc = nStr
222e0 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f   - pRhs->u.nZero
222f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22300 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22310 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
22320 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73  = MIN(nStr, pRhs
22330 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
22340 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
22350 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
22360 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
22370 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
22380 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
22390 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
223a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
223b0 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a  /* RHS is null *
223c0 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  /.    else{.    
223d0 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
223e0 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
223f0 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f     rc = (serial_
22400 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  type!=0);.    }.
22410 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
22420 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 4b 65  {.      if( pPKe
22430 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
22440 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
22450 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
22460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
22470 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
22480 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
22490 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
224a0 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20  y2, rc) );.     
224b0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
224c0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
224d0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
224e0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
224f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
22500 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69    i++;.    if( i
22510 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ==pPKey2->nField
22520 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 52   ) break;.    pR
22530 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20  hs++;.    d1 += 
22540 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
22550 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
22560 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20  type);.    idx1 
22570 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74  += sqlite3Varint
22580 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
22590 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
225a0 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72  <(unsigned)szHdr
225b0 31 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e  1 && d1<=(unsign
225c0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f  ed)nKey1 );..  /
225d0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
225e0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
225f0 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
22600 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
22610 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
22620 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
22630 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
22640 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
22650 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
22660 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
22670 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
22680 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
22690 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  m1).  */.  asser
226a0 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
226b0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
226c0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
226d0 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  at one or both o
226e0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
226f0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
22700 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
22710 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
22720 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
22730 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
22740 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
22750 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ue.  */.  assert
22760 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20  ( CORRUPT_DB .  
22770 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f       || vdbeReco
22780 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
22790 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
227a0 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66  ey2, pPKey2->def
227b0 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20  ault_rc) .      
227c0 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79   || pPKey2->pKey
227d0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
227e0 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50  Failed.  );.  pP
227f0 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31  Key2->eqSeen = 1
22800 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79  ;.  return pPKey
22810 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d  2->default_rc;.}
22820 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
22830 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
22840 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
22850 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
22860 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
22870 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
22880 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
22890 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
228a0 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  /.){.  return sq
228b0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
228c0 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
228d0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
228e0 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ey2, 0);.}.../*.
228f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22900 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
22910 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
22920 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22930 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
22940 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
22950 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
22960 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64   an integer, and
22970 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a   (b) the .** siz
22980 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
22990 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
229a0 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
229b0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
229c0 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20  e.** byte (i.e. 
229d0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  is less than 128
229e0 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  )..**.** To avoi
229f0 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74  d concerns about
22a00 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
22a10 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
22a20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20  is only used.** 
22a30 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65  on schemas where
22a40 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
22a50 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  id header size i
22a60 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65  s 63 bytes or le
22a70 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
22a80 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
22a90 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b  areInt(.  int nK
22aa0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
22ab0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
22ac0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
22ad0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
22ae0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
22af0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
22b00 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28  t u8 *aKey = &((
22b10 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29  const u8*)pKey1)
22b20 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  [*(const u8*)pKe
22b30 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e  y1 & 0x3F];.  in
22b40 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  t serial_type = 
22b50 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
22b60 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73  1)[1];.  int res
22b70 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34  ;.  u32 y;.  u64
22b80 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 69   x;.  i64 v;.  i
22b90 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41  64 lhs;..  vdbeA
22ba0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
22bb0 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
22bc0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
22bd0 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61  ->pKeyInfo);.  a
22be0 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b  ssert( (*(u8*)pK
22bf0 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f  ey1)<=0x3F || CO
22c00 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77  RRUPT_DB );.  sw
22c10 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
22c20 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
22c30 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
22c40 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
22c50 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42       lhs = ONE_B
22c60 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
22c70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
22c80 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
22c90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
22ca0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
22cb0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
22cc0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
22cd0 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
22ce0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
22cf0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
22d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22d10 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
22d20 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
22d30 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
22d40 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54   lhs = THREE_BYT
22d50 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
22d60 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
22d70 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
22d80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
22d90 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
22da0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
22db0 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
22dc0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
22dd0 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28  );.      lhs = (
22de0 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
22df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
22e00 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
22e10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
22e20 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
22e30 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
22e40 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
22e50 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
22e60 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
22e70 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
22e80 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
22e90 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
22ea0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
22eb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
22ec0 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
22ed0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
22ee0 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
22ef0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
22f00 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
22f10 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
22f20 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
22f30 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
22f40 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&x;.      test
22f50 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
22f60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22f70 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20  }.    case 8: . 
22f80 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20       lhs = 0;.  
22f90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
22fa0 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
22fb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
22fc0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  k;..    /* This 
22fd0 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65  case could be re
22fe0 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68  moved without ch
22ff0 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c  anging the resul
23000 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20  ts of running.  
23010 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20    ** this code. 
23020 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75  Including it cau
23030 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72  ses gcc to gener
23040 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69  ate a faster swi
23050 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74  tch .    ** stat
23060 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65  ement (since the
23070 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68   range of switch
23080 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61   targets now sta
23090 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a  rts at zero and.
230a0 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67      ** is contig
230b0 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e  uous) but does n
230c0 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70  ot cause any dup
230d0 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62  licate code to b
230e0 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
230f0 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c  ** (as gcc is cl
23100 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63  ever enough to c
23110 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c  ombine the two l
23120 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65  ike cases). Othe
23130 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  r .    ** compil
23140 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d  ers might be sim
23150 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63  ilar.  */ .    c
23160 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20  ase 0: case 7:. 
23170 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
23180 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
23190 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
231a0 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20  1, pPKey2);..   
231b0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
231c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
231d0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
231e0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
231f0 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20  Key2);.  }..  v 
23200 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  = pPKey2->aMem[0
23210 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c  ].u.i;.  if( v>l
23220 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
23230 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
23240 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
23250 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
23260 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
23270 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
23280 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
23290 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
232a0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
232b0 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
232c0 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
232d0 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
232e0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
232f0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
23300 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
23310 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
23320 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
23330 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
23340 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
23350 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
23360 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
23370 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
23380 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
23390 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
233a0 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
233b0 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
233c0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
233d0 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d  _rc;.    pPKey2-
233e0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d  >eqSeen = 1;.  }
233f0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
23400 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
23410 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
23420 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
23430 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
23440 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
23450 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
23460 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
23470 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
23480 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
23490 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
234a0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
234b0 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
234c0 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
234d0 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
234e0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
234f0 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
23500 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
23510 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
23520 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
23530 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
23540 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
23550 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
23560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
23570 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
23580 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
23590 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
235a0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
235b0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
235c0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
235d0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
235e0 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
235f0 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
23600 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
23610 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
23620 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
23630 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61  ssert( pPKey2->a
23640 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d  Mem[0].flags & M
23650 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65  EM_Str );.  vdbe
23660 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
23670 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
23680 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
23690 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
236a0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
236b0 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
236c0 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
236d0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
236e0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
236f0 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
23700 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
23710 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
23720 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
23730 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
23740 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
23750 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
23760 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
23770 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
23780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
23790 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
237a0 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
237b0 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
237c0 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
237d0 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
237e0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
237f0 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
23800 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
23810 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
23820 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
23830 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
23840 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
23850 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
23860 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
23870 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
23880 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
23890 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
238a0 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
238b0 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
238c0 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
238d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
238e0 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
238f0 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
23900 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
23910 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
23920 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
23930 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
23940 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
23950 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
23960 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
23970 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
23980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23990 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
239a0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
239b0 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
239c0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  >eqSeen = 1;.   
239d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
239e0 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
239f0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
23a00 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
23a10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
23a20 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
23a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
23a40 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
23a50 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
23a60 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
23a70 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
23a80 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
23a90 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
23aa0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
23ab0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
23ac0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
23ad0 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
23ae0 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
23af0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
23b00 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
23b10 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
23b20 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
23b30 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
23b40 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
23b50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
23b60 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
23b70 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
23b80 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
23b90 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
23ba0 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
23bb0 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
23bc0 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
23bd0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
23be0 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
23bf0 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
23c00 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
23c10 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
23c20 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
23c30 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
23c40 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
23c50 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
23c60 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
23c70 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
23c80 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
23c90 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
23ca0 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
23cb0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
23cc0 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
23cd0 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
23ce0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
23cf0 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
23d00 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
23d10 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
23d20 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
23d30 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
23d40 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
23d50 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
23d60 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
23d70 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
23d80 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
23d90 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
23da0 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
23db0 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
23dc0 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
23dd0 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
23de0 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
23df0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
23e00 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
23e10 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
23e20 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
23e30 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
23e40 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
23e50 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
23e60 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
23e70 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
23e80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
23e90 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
23ea0 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
23eb0 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
23ec0 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
23ed0 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
23ee0 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
23ef0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
23f00 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
23f10 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
23f20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
23f30 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
23f40 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
23f50 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
23f60 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29 7b  nAllField<=13 ){
23f70 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
23f80 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67   p->aMem[0].flag
23f90 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  s;.    if( p->pK
23fa0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
23fb0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70  er[0] ){.      p
23fc0 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->r1 = 1;.      
23fd0 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r2 = -1;.    
23fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
23ff0 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  r1 = -1;.      p
24000 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ->r2 = 1;.    }.
24010 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
24020 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20   MEM_Int) ){.   
24030 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
24040 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a  cordCompareInt;.
24050 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
24060 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
24070 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Real );.    test
24080 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
24090 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65  M_Null );.    te
240a0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
240b0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
240c0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45  if( (flags & (ME
240d0 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65  M_Real|MEM_IntRe
240e0 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  al|MEM_Null|MEM_
240f0 42 6c 6f 62 29 29 3d 3d 30 0a 20 20 20 20 20 26  Blob))==0.     &
24100 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
24110 43 6f 6c 6c 5b 30 5d 3d 3d 30 0a 20 20 20 20 29  Coll[0]==0.    )
24120 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24130 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
24140 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24150 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
24160 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
24170 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
24180 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
24190 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
241a0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
241b0 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
241c0 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
241d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
241e0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
241f0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
24200 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
24210 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
24220 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
24230 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
24240 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
24250 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
24260 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
24270 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
24280 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
24290 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
242a0 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
242b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
242c0 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
242d0 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
242e0 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
242f0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
24300 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
24310 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
24320 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
24330 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
24340 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
24350 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
24360 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
24370 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
24380 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
24390 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
243a0 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
243b0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
243c0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
243d0 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
243e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
243f0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
24400 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
24410 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24420 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
24430 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
24440 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
24450 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
24460 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
24470 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
24480 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
24490 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
244a0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
244b0 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
244c0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
244d0 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
244e0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
244f0 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
24500 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
24510 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
24520 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24530 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
24540 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
24550 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
24560 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
24570 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72  e(pCur);.  asser
24580 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
24590 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
245a0 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
245b0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
245c0 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
245d0 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
245e0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
245f0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
24600 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
24610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
24620 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
24630 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
24640 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
24650 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24660 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
24670 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
24680 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
24690 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
246a0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
246b0 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
246c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
246d0 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
246e0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
246f0 6e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n );.  testcase(
24700 20 73 7a 48 64 72 3e 30 78 37 66 66 66 66 66 66   szHdr>0x7ffffff
24710 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d  f );.  assert( m
24720 2e 6e 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 75  .n>=0 );.  if( u
24730 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
24740 7c 7c 20 73 7a 48 64 72 3e 28 75 6e 73 69 67 6e  || szHdr>(unsign
24750 65 64 29 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  ed)m.n) ){.    g
24760 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
24770 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
24780 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
24790 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
247a0 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
247b0 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
247c0 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
247d0 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
247e0 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
247f0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
24800 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
24810 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
24820 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
24830 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
24840 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
24850 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
24860 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
24870 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
24880 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
24890 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
248a0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
248b0 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
248c0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
248d0 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
248e0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
248f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
24900 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
24910 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
24920 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
24930 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
24940 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
24950 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
24960 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
24970 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
24980 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
24990 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20  es[typeRowid];. 
249a0 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29   testcase( (u32)
249b0 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f  m.n==szHdr+lenRo
249c0 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  wid );.  if( unl
249d0 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73  ikely((u32)m.n<s
249e0 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29  zHdr+lenRowid) )
249f0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
24a00 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
24a10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68  .  }..  /* Fetch
24a20 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66   the integer off
24a30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
24a40 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
24a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
24a60 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a  ialGet((u8*)&m.z
24a70 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
24a80 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
24a90 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69    *rowid = v.u.i
24aa0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
24ab0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
24ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24ad0 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
24ae0 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63  re if database c
24af0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
24b00 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61  ected after m ha
24b10 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f  s been.  ** allo
24b20 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65  cated.  Free the
24b30 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65   m object and re
24b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24b50 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69  UPT. */.idx_rowi
24b60 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20  d_corruption:.  
24b70 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61  testcase( m.szMa
24b80 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c  lloc!=0 );.  sql
24b90 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
24ba0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
24bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24bc0 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
24bd0 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
24be0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
24bf0 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
24c00 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
24c10 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
24c20 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e  ey string in pUn
24c30 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69  packed.  Write i
24c40 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
24c50 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
24c60 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
24c70 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
24c80 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
24c90 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
24ca0 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61  eater than pUnpa
24cb0 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51  cked.  Return SQ
24cc0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
24cd0 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ss..**.** pUnpac
24ce0 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72  ked is either cr
24cf0 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
24d00 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
24d10 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
24d20 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
24d30 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
24d40 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
24d50 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
24d60 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
24d70 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
24d80 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
24d90 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
24da0 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
24db0 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
24dc0 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
24dd0 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
24de0 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f  e entire key..*/
24df0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
24e00 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
24e10 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
24e40 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
24e50 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e70 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
24e80 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
24e90 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
24ea0 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
24eb0 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
24ec0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
24ed0 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
24f00 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
24f10 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
24f20 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
24f30 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
24f40 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
24f50 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
24f60 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
24f70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
24f80 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d   );.  pCur = pC-
24f90 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61  >uc.pCursor;.  a
24fa0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
24fb0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
24fc0 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c  (pCur) );.  nCel
24fd0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  lKey = sqlite3Bt
24fe0 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
24ff0 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c  Cur);.  /* nCell
25000 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
25010 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
25020 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
25030 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
25040 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
25050 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
25060 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
25070 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
25080 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
25090 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
250a0 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
250b0 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
250c0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
250d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
250e0 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
250f0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
25100 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
25110 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
25120 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
25130 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26  (u32)nCellKey, &
25140 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
25150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25160 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69   }.  *res = sqli
25170 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
25180 70 61 72 65 57 69 74 68 53 6b 69 70 28 6d 2e 6e  pareWithSkip(m.n
25190 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
251a0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
251b0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
251c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
251d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
251e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
251f0 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
25200 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
25210 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
25220 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
25230 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
25240 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
25250 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
25260 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
25270 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
25280 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
25290 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
252a0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
252b0 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
252c0 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
252d0 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
252e0 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
252f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
25300 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
25310 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
25320 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
25330 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
25340 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
25350 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
25360 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
25370 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
25380 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
25390 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
253a0 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
253b0 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
253c0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
253d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
253e0 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
253f0 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
25400 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
25410 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
25420 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
25430 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
25440 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
25450 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
25460 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
25470 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
25480 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
25490 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
254a0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
254b0 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
254c0 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
254d0 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
254e0 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
254f0 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
25500 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
25510 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
25520 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
25530 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 43 6f 64  e..**.** If iCod
25540 65 20 69 73 20 31 2c 20 74 68 65 6e 20 65 78 70  e is 1, then exp
25550 69 72 61 74 69 6f 6e 20 69 73 20 61 64 76 69 73  iration is advis
25560 6f 72 79 2e 20 20 54 68 65 20 73 74 61 74 65 6d  ory.  The statem
25570 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ent should.** be
25580 20 72 65 70 72 65 70 61 72 65 64 20 62 65 66 6f   reprepared befo
25590 72 65 20 62 65 69 6e 67 20 72 65 73 74 61 72 74  re being restart
255a0 65 64 2c 20 62 75 74 20 69 66 20 69 74 20 69 73  ed, but if it is
255b0 20 61 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67   already running
255c0 0a 2a 2a 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  .** it is allowe
255d0 64 20 74 6f 20 72 75 6e 20 74 6f 20 63 6f 6d 70  d to run to comp
255e0 6c 65 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  letion..**.** In
255f0 74 65 72 6e 61 6c 6c 79 2c 20 74 68 69 73 20 66  ternally, this f
25600 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 73 65 74  unction just set
25610 73 20 74 68 65 20 56 64 62 65 2e 65 78 70 69 72  s the Vdbe.expir
25620 65 64 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a  ed flag on all.*
25630 2a 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  * prepared state
25640 6d 65 6e 74 73 2e 20 20 54 68 65 20 66 6c 61 67  ments.  The flag
25650 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
25660 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 65 78   an immediate ex
25670 70 69 72 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  piration.** and 
25680 73 65 74 20 74 6f 20 32 20 66 6f 72 20 61 6e 20  set to 2 for an 
25690 61 64 76 69 73 6f 72 79 20 65 78 70 69 72 61 74  advisory expirat
256a0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
256b0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
256c0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
256d0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 43  ite3 *db, int iC
256e0 6f 64 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  ode){.  Vdbe *p;
256f0 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
25700 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
25710 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
25720 69 72 65 64 20 3d 20 69 43 6f 64 65 2b 31 3b 0a  ired = iCode+1;.
25730 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
25740 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
25750 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
25760 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
25770 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
25780 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
25790 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
257a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
257b0 68 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52  he SQLITE_PREPAR
257c0 45 20 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64  E flags for a Vd
257d0 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  be..*/.u8 sqlite
257e0 33 56 64 62 65 50 72 65 70 61 72 65 46 6c 61 67  3VdbePrepareFlag
257f0 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  s(Vdbe *v){.  re
25800 74 75 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67  turn v->prepFlag
25810 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
25820 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25830 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
25840 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
25850 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
25860 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
25870 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e  er iVar of VM v.
25880 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
25890 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20  value is an SQL 
258a0 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  NULL, return .**
258b0 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65   0 instead. Unle
258c0 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61  ss it is NULL, a
258d0 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66  pply affinity af
258e0 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  f (one of the SQ
258f0 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f  LITE_AFF_*.** co
25900 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20  nstants) to the 
25910 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
25920 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  urning it..**.**
25930 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
25940 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65  lue must be free
25950 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
25960 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c  using sqlite3Val
25970 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  ueFree()..*/.sql
25980 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
25990 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
259a0 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
259b0 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
259c0 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
259d0 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
259e0 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
259f0 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
25a00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 76  ;.    assert( (v
25a10 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
25a20 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29  LITE_EnableQPSG)
25a30 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==0 );.    if( 0
25a40 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
25a50 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
25a60 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
25a70 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
25a80 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
25a90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
25aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25ab0 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
25ac0 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
25ad0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25ae0 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
25af0 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
25b00 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
25b10 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
25b20 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
25b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
25b40 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
25b50 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
25b60 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
25b70 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
25b80 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
25b90 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
25ba0 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
25bb0 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
25bc0 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
25bd0 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
25be0 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
25bf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25c00 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
25c10 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
25c20 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
25c30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
25c40 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  v->db->flags & S
25c50 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47  QLITE_EnableQPSG
25c60 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56  )==0 );.  if( iV
25c70 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d  ar>=32 ){.    v-
25c80 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30  >expmask |= 0x80
25c90 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b  000000;.  }else{
25ca0 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
25cb0 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69  |= ((u32)1 << (i
25cc0 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Var-1));.  }.}..
25cd0 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 20 66 75  /*.** Cause a fu
25ce0 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20  nction to throw 
25cf0 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 77  an error if it w
25d00 61 73 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f  as call from OP_
25d10 50 75 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74 68  PureFunc.** rath
25d20 65 72 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63 74  er than OP_Funct
25d30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75  ion..**.** OP_Pu
25d40 72 65 46 75 6e 63 20 6d 65 61 6e 73 20 74 68 61  reFunc means tha
25d50 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d  t the function m
25d60 75 73 74 20 62 65 20 64 65 74 65 72 6d 69 6e 69  ust be determini
25d70 73 74 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c 64  stic, and should
25d80 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 65 72 72  .** throw an err
25d90 6f 72 20 69 66 20 69 74 20 69 73 20 67 69 76 65  or if it is give
25da0 6e 20 69 6e 70 75 74 73 20 74 68 61 74 20 77 6f  n inputs that wo
25db0 75 6c 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d  uld make it non-
25dc0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a 2a  deterministic..*
25dd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25de0 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 64 61 74  s invoked by dat
25df0 65 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73  e/time functions
25e00 20 74 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64 65   that use non-de
25e10 74 65 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20 66  terministic.** f
25e20 65 61 74 75 72 65 73 20 73 75 63 68 20 61 73 20  eatures such as 
25e30 27 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71  'now'..*/.int sq
25e40 6c 69 74 65 33 4e 6f 74 50 75 72 65 46 75 6e 63  lite3NotPureFunc
25e50 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
25e60 20 2a 70 43 74 78 29 7b 0a 23 69 66 64 65 66 20   *pCtx){.#ifdef 
25e70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
25e80 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69  AT3_OR_STAT4.  i
25e90 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d  f( pCtx->pVdbe==
25ea0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  0 ) return 1;.#e
25eb0 6e 64 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d  ndif.  if( pCtx-
25ec0 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78  >pVdbe->aOp[pCtx
25ed0 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  ->iOp].opcode==O
25ee0 50 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a 20 20  P_PureFunc ){.  
25ef0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
25f00 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
25f10 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72 6d       "non-determ
25f20 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
25f30 20 69 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73   in index expres
25f40 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63 6f  sion or CHECK co
25f50 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20 20 20 20  nstraint",.     
25f60 20 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72    -1);.    retur
25f70 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
25f80 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 1;.}..#ifndef 
25f90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
25fa0 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
25fb0 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
25fc0 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
25fd0 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
25fe0 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
25ff0 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
26000 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
26010 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
26020 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
26030 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
26040 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
26050 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
26060 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
26070 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
26080 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
26090 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
260a0 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69  tab *pVtab){.  i
260b0 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  f( pVtab->zErrMs
260c0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
260d0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
260e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
260f0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
26100 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
26110 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
26120 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72  p(db, pVtab->zEr
26130 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
26140 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
26150 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74  ErrMsg);.    pVt
26160 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
26170 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
26180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
26190 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
261a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
261b0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
261c0 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K../*.** If the 
261d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
261e0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c  is not NULL, rel
261f0 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74  ease any allocat
26200 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
26210 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d  .** with the mem
26220 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  ory cells in the
26230 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79   p->aMem[] array
26240 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20  . Also free the 
26250 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
26260 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  * structure itse
26270 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65  lf, using sqlite
26280 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  3DbFree()..**.**
26290 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
262a0 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20 55  s used to free U
262b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
262c0 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74  ructures allocat
262d0 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62  ed by.** the vdb
262e0 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20  eUnpackRecord() 
262f0 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
26300 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a  n vdbeapi.c..*/.
26310 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
26320 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c  FreeUnpacked(sql
26330 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
26340 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65  ield, UnpackedRe
26350 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
26360 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
26370 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
26380 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
26390 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
263a0 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20  p->aMem[i];.    
263b0 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c    if( pMem->zMal
263c0 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62  loc ) sqlite3Vdb
263d0 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
263e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
263f0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
26400 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   p);.  }.}.#endi
26410 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
26420 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
26430 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  K */..#ifdef SQL
26440 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
26450 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
26460 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
26470 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74  pdate hook. If t
26480 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
26490 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75   or DELETE pre-u
264a0 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74  pdate call,.** t
264b0 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65  hen cursor passe
264c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
264d0 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
264e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77  point to the row
264f0 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20   about.** to be 
26500 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  update or delete
26510 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  d. If the applic
26520 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ation calls sqli
26530 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
26540 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75  d(),.** the requ
26550 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ired value will 
26560 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
26570 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20   row the cursor 
26580 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f  points to..*/.vo
26590 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
265a0 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56  eUpdateHook(.  V
265b0 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
265d0 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74  * Vdbe pre-updat
265e0 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65  e hook is invoke
265f0 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75  d by */.  VdbeCu
26600 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
26610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26620 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e  sor to grab old.
26630 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f  * values from */
26640 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26660 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53     /* SQLITE_INS
26670 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
26680 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  ELETE */.  const
26690 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
266a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
266b0 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
266c0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
266d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266e0 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62   /* Modified tab
266f0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  le */.  i64 iKey
26700 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
26710 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
26720 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  al key value */.
26730 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
26760 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a  r new.* record *
26770 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26780 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36  db = v->db;.  i6
26790 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70  4 iKey2;.  PreUp
267a0 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a  date preupdate;.
267b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
267c0 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl = pTab->zName
267d0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
267e0 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65   u8 fakeSortOrde
267f0 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
26800 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  ( db->pPreUpdate
26810 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
26820 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73  &preupdate, 0, s
26830 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29  izeof(PreUpdate)
26840 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69  );.  if( HasRowi
26850 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  d(pTab)==0 ){.  
26860 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20    iKey1 = iKey2 
26870 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61  = 0;.    preupda
26880 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  te.pPk = sqlite3
26890 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
268a0 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
268b0 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
268c0 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
268d0 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d     iKey2 = v->aM
268e0 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20  em[iReg].u.i;.  
268f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
26900 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key2 = iKey1;.  
26910 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
26920 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  t( pCsr->nField=
26930 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20  =pTab->nCol .   
26940 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46      || (pCsr->nF
26950 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
26960 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  +1 && op==SQLITE
26970 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d  _DELETE && iReg=
26980 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65  =-1).  );..  pre
26990 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20  update.v = v;.  
269a0 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d  preupdate.pCsr =
269b0 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61   pCsr;.  preupda
269c0 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72  te.op = op;.  pr
269d0 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20  eupdate.iNewReg 
269e0 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64  = iReg;.  preupd
269f0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d  ate.keyinfo.db =
26a00 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65   db;.  preupdate
26a10 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45  .keyinfo.enc = E
26a20 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64  NC(db);.  preupd
26a30 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79  ate.keyinfo.nKey
26a40 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43  Field = pTab->nC
26a50 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  ol;.  preupdate.
26a60 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64  keyinfo.aSortOrd
26a70 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53  er = (u8*)&fakeS
26a80 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75  ortOrder;.  preu
26a90 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b  pdate.iKey1 = iK
26aa0 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey1;.  preupdate
26ab0 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a  .iKey2 = iKey2;.
26ac0 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61 62    preupdate.pTab
26ad0 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e   = pTab;..  db->
26ae0 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70 72  pPreUpdate = &pr
26af0 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78  eupdate;.  db->x
26b00 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
26b10 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  k(db->pPreUpdate
26b20 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62  Arg, db, op, zDb
26b30 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69  , zTbl, iKey1, i
26b40 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72  Key2);.  db->pPr
26b50 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73  eUpdate = 0;.  s
26b60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
26b70 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f   preupdate.aReco
26b80 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55  rd);.  vdbeFreeU
26b90 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75  npacked(db, preu
26ba0 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b  pdate.keyinfo.nK
26bb0 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70  eyField+1, preup
26bc0 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b  date.pUnpacked);
26bd0 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
26be0 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
26bf0 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
26c00 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
26c10 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a  .pNewUnpacked);.
26c20 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e    if( preupdate.
26c30 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  aNew ){.    int 
26c40 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
26c50 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20  i<pCsr->nField; 
26c60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
26c70 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
26c80 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65  e(&preupdate.aNe
26c90 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w[i]);.    }.   
26ca0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
26cb0 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61  (db, preupdate.a
26cc0 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  New);.  }.}.#end
26cd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
26ce0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
26cf0 4f 4b 20 2a 2f 0a                                OK */.