/ Hex Artifact Content
Login

Artifact eb444562f0adbfb7e07b5a2a7ce4b21231c4c9d6d5b32411fcf806223b2bf6c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 76 2d 3e   int nNew = (v->
1180: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
1190: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  v->nOpAlloc*2 : 
11a0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
11c0: 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (v->nOpAllo
11d0: 63 20 3f 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? v->nOpAlloc*
11e0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
11f0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
1200: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1210: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
1220: 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  /* Ensure that t
1230: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 56 44 42  he size of a VDB
1240: 45 20 64 6f 65 73 20 6e 6f 74 20 67 72 6f 77 20  E does not grow 
1250: 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20 20 69  too large */.  i
1260: 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e 64 62 2d  f( nNew > p->db-
1270: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1280: 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 20 29 7b  IMIT_VDBE_OP] ){
1290: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
12a0: 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  ault(p->db);.   
12b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12c0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  OMEM;.  }..  ass
12d0: 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f  ert( nOp<=(1024/
12e0: 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20  sizeof(Op)) );. 
12f0: 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28   assert( nNew>=(
1300: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
1310: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
1320: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
1330: 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65  >db, v->aOp, nNe
1340: 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  w*sizeof(Op));. 
1350: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1360: 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20   p->szOpAlloc = 
1370: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1380: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
1390: 3b 0a 20 20 20 20 76 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    v->nOpAllo
13a0: 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  c = p->szOpAlloc
13b0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
13c0: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
13d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
13e0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
13f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1400: 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  PT);.}..#ifdef S
1410: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
1420: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
1430: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
1440: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1450: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
1460: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
1470: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
1480: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
1490: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
14a0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
14b0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
14c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
14d0: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
14e0: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
14f0: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
1500: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
1510: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1520: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
1530: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
1540: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
1550: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
1560: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
1570: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
1580: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
1590: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
15a0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
15b0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
15c0: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
15d0: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
15e0: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
15f0: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
1600: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
1610: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
1620: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
1630: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
1640: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
1650: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
1660: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
1670: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
1680: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
1690: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
16a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
16b0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
16c0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
16d0: 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f  INLINE int growO
16e0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
16f0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1700: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61  p2, int p3){.  a
1710: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
1720: 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  oc<=p->nOp );.  
1730: 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28  if( growOpArray(
1740: 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 31  p, 1) ) return 1
1750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
1760: 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29  OpAlloc>p->nOp )
1770: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1790: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
17a0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
17b0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
17c0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
17d0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
17e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
17f0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
1800: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
1810: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1820: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1830: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30  .  assert( op>=0
1840: 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20   && op<0xff );. 
1850: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
1860: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=i ){.    retur
1870: 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c  n growOp3(p, op,
1880: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1890: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
18a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
18b0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
18c0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d  = (u8)op;.  pOp-
18d0: 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p5 = 0;.  pOp->
18e0: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
18f0: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
1900: 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e  p3 = p3;.  pOp->
1910: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.p = 0;.  pOp-
1920: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
1930: 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c  USED;.#ifdef SQL
1940: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
1950: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f  IN_COMMENTS.  pO
1960: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  p->zComment = 0;
1970: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1980: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1990: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
19a0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
19b0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pTrace ){.    sq
19c0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
19d0: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
19e0: 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64  ]);.    test_add
19f0: 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  op_breakpoint();
1a00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
1a10: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
1a20: 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20    pOp->cycles = 
1a30: 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20  0;.  pOp->cnt = 
1a40: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1a50: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1a60: 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72  ERAGE.  pOp->iSr
1a70: 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69  cLine = 0;.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1a90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1aa0: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1ab0: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad0: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1ae0: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1af0: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1b00: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1b10: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
1b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b30: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
1b40: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1b50: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
1b60: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1b70: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1b80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1b90: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1ba0: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  1, p2, 0);.}../*
1bb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1bc0: 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  or an unconditio
1bd0: 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  nal jump to inst
1be0: 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f  ruction iDest.*/
1bf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1c00: 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e  Goto(Vdbe *p, in
1c10: 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75  t iDest){.  retu
1c20: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1c30: 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp3(p, OP_Goto,
1c40: 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d   0, iDest, 0);.}
1c50: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1c60: 64 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  de to cause the 
1c70: 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62  string zStr to b
1c80: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a  e loaded into.**
1c90: 20 72 65 67 69 73 74 65 72 20 69 44 65 73 74 0a   register iDest.
1ca0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1cb0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62  beLoadString(Vdb
1cc0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
1ce0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
1cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1d00: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
1d10: 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c   iDest, 0, zStr,
1d20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
1d30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1d40: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c   initializes mul
1d50: 74 69 70 6c 65 20 72 65 67 69 73 74 65 72 73 20  tiple registers 
1d60: 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74  to string or int
1d70: 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  eger.** constant
1d80: 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
1d90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 69 44 65  s begin with iDe
1da0: 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20  st and increase 
1db0: 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a  consecutively..*
1dc0: 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69  * One register i
1dd0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f  s initialized fo
1de0: 72 20 65 61 63 68 20 63 68 61 72 61 63 67 74 65  r each characgte
1df0: 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20  r in zTypes[].  
1e00: 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20  For each.** "s" 
1e10: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79  character in zTy
1e20: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1e30: 74 65 72 20 69 73 20 61 20 73 74 72 69 6e 67 20  ter is a string 
1e40: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1e50: 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20  is.** not NULL, 
1e60: 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68  or OP_Null if th
1e70: 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c  e value is a nul
1e80: 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20  l pointer.  For 
1e90: 65 61 63 68 20 22 69 22 20 63 68 61 72 61 63 74  each "i" charact
1ea0: 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b  er.** in zTypes[
1eb0: 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ], the register 
1ec0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1ed0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  o an integer..**
1ee0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
1ef0: 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74   string does not
1f00: 20 65 6e 64 20 77 69 74 68 20 22 58 22 20 74 68   end with "X" th
1f10: 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52  en an OP_ResultR
1f20: 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  ow instruction.*
1f30: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  * is generated f
1f40: 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  or the values in
1f50: 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  serted..*/.void 
1f60: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
1f70: 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  Load(Vdbe *p, in
1f80: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
1f90: 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e  har *zTypes, ...
1fa0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1fb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1fc0: 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   c;.  va_start(a
1fd0: 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f  p, zTypes);.  fo
1fe0: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70  r(i=0; (c = zTyp
1ff0: 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  es[i])!=0; i++){
2000: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20  .    if( c=='s' 
2010: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2020: 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28  har *z = va_arg(
2030: 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
2040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2050: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d  dbeAddOp4(p, z==
2060: 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50  0 ? OP_Null : OP
2070: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65  _String8, 0, iDe
2080: 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a  st+i, 0, z, 0);.
2090: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
20a0: 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 73 71  ='i' ){.      sq
20b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20c0: 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76  p, OP_Integer, v
20d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20  a_arg(ap, int), 
20e0: 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20 7d 65  iDest+i);.    }e
20f0: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
2100: 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f  skip_op_resultro
2110: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  w;.    }.  }.  s
2120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2130: 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (p, OP_ResultRow
2140: 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73 6b 69  , iDest, i);.ski
2150: 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3a 0a  p_op_resultrow:.
2160: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
2170: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2180: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2190: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
21a0: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
21b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
21c0: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
21d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
21e0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
21f0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
2200: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
2210: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
2220: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
2230: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
2240: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
2250: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
2260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2270: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
2280: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
2290: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
22a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
22b0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
22c0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
22d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
22e0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
22f0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
2300: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
2310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2320: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
2330: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
2340: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
2350: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
2360: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
2370: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
2380: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2390: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
23a0: 61 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49  alue with a P4_I
23b0: 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45  NT64 or.** P4_RE
23c0: 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  AL type..*/.int 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23e0: 34 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70  4Dup8(.  Vdbe *p
23f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2400: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
2410: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
2420: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
2430: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
2440: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
2450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2460: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
2470: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
2480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2490: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
24a0: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
24b0: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
24c0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
24d0: 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f   u8 *zP4,      /
24e0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
2500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
2510: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
2520: 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70  ){.  char *p4cop
2530: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
2540: 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33  locRawNN(sqlite3
2550: 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20  VdbeDb(p), 8);. 
2560: 20 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65   if( p4copy ) me
2570: 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34  mcpy(p4copy, zP4
2580: 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 8);.  return s
2590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25a0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
25b0: 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79  p3, p4copy, p4ty
25c0: 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  pe);.}..#ifndef 
25d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
25e0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AIN./*.** Return
25f0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2600: 74 68 65 20 63 75 72 72 65 6e 74 20 45 58 50 4c  the current EXPL
2610: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 62  AIN QUERY PLAN b
2620: 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20 6d 65  aseline..** 0 me
2630: 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69  ans "none"..*/.i
2640: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  nt sqlite3VdbeEx
2650: 70 6c 61 69 6e 50 61 72 65 6e 74 28 50 61 72 73  plainParent(Pars
2660: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
2670: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
2680: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2690: 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  lain==0 ) return
26a0: 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69   0;.  pOp = sqli
26b0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 50 61  te3VdbeGetOp(pPa
26c0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
26d0: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29  se->addrExplain)
26e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
26f0: 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  p2;.}../*.** Set
2700: 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
2710: 6b 70 6f 69 6e 74 20 6f 6e 20 74 68 65 20 66 6f  kpoint on the fo
2720: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
2730: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d  in order to.** m
2740: 6f 6e 69 74 6f 72 20 74 68 65 20 45 58 50 4c 41  onitor the EXPLA
2750: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2760: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a  de generation..*
2770: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
2780: 4c 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64  LITE_DEBUG).void
2790: 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42   sqlite3ExplainB
27a0: 72 65 61 6b 70 6f 69 6e 74 28 63 6f 6e 73 74 20  reakpoint(const 
27b0: 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20  char *z1, const 
27c0: 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 28 76 6f  char *z2){.  (vo
27d0: 69 64 29 7a 31 3b 0a 20 20 28 76 6f 69 64 29 7a  id)z1;.  (void)z
27e0: 32 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  2;.}.#endif../*.
27f0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f  ** Add a new OP_
2800: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
2810: 66 20 74 68 65 20 62 50 75 73 68 20 66 6c 61 67  f the bPush flag
2820: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d   is true, then m
2830: 61 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ake this opcode 
2840: 74 68 65 20 70 61 72 65 6e 74 20 66 6f 72 0a 2a  the parent for.*
2850: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 45 78 70  * subsequent Exp
2860: 6c 61 69 6e 73 20 75 6e 74 69 6c 20 73 71 6c 69  lains until sqli
2870: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f  te3VdbeExplainPo
2880: 70 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  p() is called..*
2890: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
28a0: 62 65 45 78 70 6c 61 69 6e 28 50 61 72 73 65 20  beExplain(Parse 
28b0: 2a 70 50 61 72 73 65 2c 20 75 38 20 62 50 75 73  *pParse, u8 bPus
28c0: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
28d0: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 23 69 66 6e 64  Fmt, ...){.#ifnd
28e0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28f0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 69 6e 63 6c    /* Always incl
2900: 75 64 65 20 74 68 65 20 4f 50 5f 45 78 70 6c 61  ude the OP_Expla
2910: 69 6e 20 6f 70 63 6f 64 65 73 20 69 66 20 53 51  in opcodes if SQ
2920: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
2930: 66 69 6e 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  fined..  ** But 
2940: 6f 6d 69 74 20 74 68 65 6d 20 28 66 6f 72 20 70  omit them (for p
2950: 65 72 66 6f 72 6d 61 6e 63 65 29 20 64 75 72 69  erformance) duri
2960: 6e 67 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75  ng production bu
2970: 69 6c 64 73 20 2a 2f 0a 20 20 69 66 28 20 70 50  ilds */.  if( pP
2980: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2990: 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
29a0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
29b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76    Vdbe *v;.    v
29c0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69  a_list ap;.    i
29d0: 6e 74 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61  nt iThis;.    va
29e0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
29f0: 3b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  ;.    zMsg = sql
2a00: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61  ite3VMPrintf(pPa
2a10: 72 73 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61  rse->db, zFmt, a
2a20: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
2a30: 70 29 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72  p);.    v = pPar
2a40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69  se->pVdbe;.    i
2a50: 54 68 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  This = v->nOp;. 
2a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a70: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
2a80: 69 6e 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73  in, iThis, pPars
2a90: 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  e->addrExplain, 
2aa0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2ab0: 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50           zMsg, P
2ac0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
2ad0: 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 72  sqlite3ExplainBr
2ae0: 65 61 6b 70 6f 69 6e 74 28 62 50 75 73 68 3f 22  eakpoint(bPush?"
2af0: 50 55 53 48 22 3a 22 22 2c 20 73 71 6c 69 74 65  PUSH":"", sqlite
2b00: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
2b10: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28  ->p4.z);.    if(
2b20: 20 62 50 75 73 68 29 7b 0a 20 20 20 20 20 20 70   bPush){.      p
2b30: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
2b40: 69 6e 20 3d 20 69 54 68 69 73 3b 0a 20 20 20 20  in = iThis;.    
2b50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2b60: 6f 70 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  op the EXPLAIN Q
2b70: 55 45 52 59 20 50 4c 41 4e 20 73 74 61 63 6b 20  UERY PLAN stack 
2b80: 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  one level..*/.vo
2b90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  id sqlite3VdbeEx
2ba0: 70 6c 61 69 6e 50 6f 70 28 50 61 72 73 65 20 2a  plainPop(Parse *
2bb0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
2bc0: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2bd0: 69 6e 74 28 22 50 4f 50 22 2c 20 30 29 3b 0a 20  int("POP", 0);. 
2be0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2bf0: 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64  lain = sqlite3Vd
2c00: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2c10: 70 50 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69  pParse);.}.#endi
2c20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c30: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a  _EXPLAIN */../*.
2c40: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
2c50: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
2c60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2c70: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
2c80: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
2c90: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
2ca0: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
2cb0: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
2cc0: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
2cd0: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
2ce0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
2cf0: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
2d00: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
2d10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2d20: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
2d30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
2d40: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
2d50: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
2d60: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
2d70: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
2d80: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
2d90: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
2da0: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
2db0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  j;.  sqlite3Vdbe
2dc0: 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72  AddOp4(p, OP_Par
2dd0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
2de0: 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f  , 0, zWhere, P4_
2df0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28  DYNAMIC);.  for(
2e00: 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44  j=0; j<p->db->nD
2e10: 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56  b; j++) sqlite3V
2e20: 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20  dbeUsesBtree(p, 
2e30: 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  j);.}../*.** Add
2e40: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
2e50: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
2e60: 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65  value as an inte
2e70: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e80: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2e90: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2ea0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2eb0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2ec0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
2ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2ee0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
2ef0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
2f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f10: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
2f20: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2f30: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2f40: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2f50: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2f60: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20   */.  int p4    
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f90: 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61   P4 operand as a
2fa0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a  n integer */.){.
2fb0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
2fd0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
2fe0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
2ff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
3000: 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  ){.    VdbeOp *p
3010: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
3020: 72 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  r];.    pOp->p4t
3030: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
3040: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
3050: 70 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p4;.  }.  return
3060: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73   addr;.}../* Ins
3070: 65 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ert the end of a
3080: 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76   co-routine.*/.v
3090: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
30a0: 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65  ndCoroutine(Vdbe
30b0: 20 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c   *v, int regYiel
30c0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d){.  sqlite3Vdb
30d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
30e0: 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  dCoroutine, regY
30f0: 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  ield);..  /* Cle
3100: 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ar the temporary
3110: 20 72 65 67 69 73 74 65 72 20 63 61 63 68 65 2c   register cache,
3120: 20 74 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e   thereby ensurin
3130: 67 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a  g that each.  **
3140: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20   co-routine has 
3150: 69 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64  its own independ
3160: 65 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69 73  ent set of regis
3170: 74 65 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f  ters, because co
3180: 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d  -routines.  ** m
3190: 69 67 68 74 20 65 78 70 65 63 74 20 74 68 65 69  ight expect thei
31a0: 72 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 62  r registers to b
31b0: 65 20 70 72 65 73 65 72 76 65 64 20 61 63 72 6f  e preserved acro
31c0: 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20  ss an OP_Yield, 
31d0: 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f  and.  ** that co
31e0: 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65  uld cause proble
31f0: 6d 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ms if two or mor
3200: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72  e co-routines ar
3210: 65 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  e using the same
3220: 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
3230: 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20  register..  */. 
3240: 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d   v->pParse->nTem
3250: 70 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70  pReg = 0;.  v->p
3260: 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
3270: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
3280: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
3290: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
32a0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
32b0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
32c0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
32d0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
32e0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
32f0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
3300: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
3310: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
3320: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
3330: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
3340: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
3350: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
3360: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
3370: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
3380: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
3390: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
33a0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
33b0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
33c0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
33d0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
33e0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
33f0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
3400: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
3410: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
3420: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
3430: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
3440: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
3450: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
3460: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
3470: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
3480: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
3490: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
34a0: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
34b0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
34c0: 65 64 2e 0a 2a 2a 20 28 4c 61 74 65 72 3a 29 20  ed..** (Later:) 
34d0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 74 72 75  This is only tru
34e0: 65 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 74 68  e for opcodes th
34f0: 61 74 20 68 61 76 65 20 74 68 65 20 4f 50 46 4c  at have the OPFL
3500: 47 5f 4a 55 4d 50 0a 2a 2a 20 70 72 6f 70 65 72  G_JUMP.** proper
3510: 74 79 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ty..**.** Variab
3520: 6c 65 20 75 73 61 67 65 20 6e 6f 74 65 73 3a 0a  le usage notes:.
3530: 2a 2a 0a 2a 2a 20 20 20 20 20 50 61 72 73 65 2e  **.**     Parse.
3540: 61 4c 61 62 65 6c 5b 78 5d 20 20 20 20 20 53 74  aLabel[x]     St
3550: 6f 72 65 73 20 74 68 65 20 61 64 64 72 65 73 73  ores the address
3560: 20 74 68 61 74 20 74 68 65 20 78 2d 74 68 20 6c   that the x-th l
3570: 61 62 65 6c 20 72 65 73 6f 6c 76 65 73 0a 2a 2a  abel resolves.**
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 20 20 20 20 20 20 20 69 6e 74 6f 2e 20 20           into.  
35a0: 46 6f 72 20 74 65 73 74 69 6e 67 20 28 53 51 4c  For testing (SQL
35b0: 49 54 45 5f 44 45 42 55 47 29 2c 20 75 6e 72 65  ITE_DEBUG), unre
35c0: 73 6f 6c 76 65 64 0a 2a 2a 20 20 20 20 20 20 20  solved.**       
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 6c 61 62 65 6c 73 20 73 74 6f 72 65 73 20    labels stores 
35f0: 2d 31 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  -1, but that is 
3600: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  not required..**
3610: 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61 62 65       Parse.nLabe
3620: 6c 41 6c 6c 6f 63 20 20 20 4e 75 6d 62 65 72 20  lAlloc   Number 
3630: 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  of slots allocat
3640: 65 64 20 74 6f 20 50 61 72 73 65 2e 61 4c 61 62  ed to Parse.aLab
3650: 65 6c 5b 5d 0a 2a 2a 20 20 20 20 20 50 61 72 73  el[].**     Pars
3660: 65 2e 6e 4c 61 62 65 6c 20 20 20 20 20 20 20 20  e.nLabel        
3670: 54 68 65 20 2a 6e 65 67 61 74 69 76 65 2a 20 6f  The *negative* o
3680: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
3690: 6c 61 62 65 6c 73 20 74 68 61 74 20 68 61 76 65  labels that have
36a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e              been
36c0: 20 69 73 73 75 65 64 2e 20 20 54 68 65 20 6e 65   issued.  The ne
36d0: 67 61 74 69 76 65 20 69 73 20 73 74 6f 72 65 64  gative is stored
36e0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 74 68 61 74 20 67 69 76 65 73 20 61      that gives a
3710: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
3720: 72 6f 76 65 6d 65 6e 74 20 6f 76 65 72 20 73 74  rovement over st
3730: 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oring.**        
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
3760: 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e 0a  positive value..
3770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3780: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 50 61 72 73  beMakeLabel(Pars
3790: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 72 65  e *pParse){.  re
37a0: 74 75 72 6e 20 2d 2d 70 50 61 72 73 65 2d 3e 6e  turn --pParse->n
37b0: 4c 61 62 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Label;.}../*.** 
37c0: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
37d0: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
37e0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
37f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
3800: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
3810: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
3820: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
3830: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3840: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
3850: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
3860: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 73 74 61  eLabel()..*/.sta
3870: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
3880: 49 4e 45 20 76 6f 69 64 20 72 65 73 69 7a 65 52  INE void resizeR
3890: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 50 61 72 73  esolveLabel(Pars
38a0: 65 20 2a 70 2c 20 56 64 62 65 20 2a 76 2c 20 69  e *p, Vdbe *v, i
38b0: 6e 74 20 6a 29 7b 0a 20 20 69 6e 74 20 6e 4e 65  nt j){.  int nNe
38c0: 77 53 69 7a 65 20 3d 20 31 30 20 2d 20 70 2d 3e  wSize = 10 - p->
38d0: 6e 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 61 4c 61  nLabel;.  p->aLa
38e0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52  bel = sqlite3DbR
38f0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e  eallocOrFree(p->
3900: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20  db, p->aLabel,. 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 6e 4e 65 77 53 69 7a 65 2a 73 69 7a      nNewSize*siz
3930: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
3940: 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61  ));.  if( p->aLa
3950: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  bel==0 ){.    p-
3960: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 30  >nLabelAlloc = 0
3970: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
3980: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3990: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
39a0: 72 28 69 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  r(i=p->nLabelAll
39b0: 6f 63 3b 20 69 3c 6e 4e 65 77 53 69 7a 65 3b 20  oc; i<nNewSize; 
39c0: 69 2b 2b 29 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  i++) p->aLabel[i
39d0: 5d 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20  ] = -1;.#endif. 
39e0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
39f0: 63 20 3d 20 6e 4e 65 77 53 69 7a 65 3b 0a 20 20  c = nNewSize;.  
3a00: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
3a10: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 76   v->nOp;.  }.}.v
3a20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
3a30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
3a40: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
3a50: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
3a60: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41  rse;.  int j = A
3a70: 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74  DDR(x);.  assert
3a80: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
3a90: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3aa0: 20 61 73 73 65 72 74 28 20 6a 3c 2d 70 2d 3e 6e   assert( j<-p->n
3ab0: 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Label );.  asser
3ac0: 74 28 20 6a 3e 3d 30 20 29 3b 0a 23 69 66 64 65  t( j>=0 );.#ifde
3ad0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3ae0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
3af0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
3b00: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
3b10: 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c 56 45   printf("RESOLVE
3b20: 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25 64 5c   LABEL %d to %d\
3b30: 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b 0a  n", x, v->nOp);.
3b40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
3b50: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
3b60: 2b 20 70 2d 3e 6e 4c 61 62 65 6c 20 3c 20 30 20  + p->nLabel < 0 
3b70: 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 52 65 73  ){.    resizeRes
3b80: 6f 6c 76 65 4c 61 62 65 6c 28 70 2c 76 2c 6a 29  olveLabel(p,v,j)
3b90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3ba0: 73 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c  ssert( p->aLabel
3bb0: 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  [j]==(-1) ); /* 
3bc0: 4c 61 62 65 6c 73 20 6d 61 79 20 6f 6e 6c 79 20  Labels may only 
3bd0: 62 65 20 72 65 73 6f 6c 76 65 64 20 6f 6e 63 65  be resolved once
3be0: 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   */.    p->aLabe
3bf0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
3c00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
3c10: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
3c20: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
3c30: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
3c40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3c50: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
3c60: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
3c70: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
3c80: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
3c90: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
3ca0: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
3cb0: 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  n multiple times
3cc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3cd0: 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 56 64  3VdbeReusable(Vd
3ce0: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e  be *p){.  p->run
3cf0: 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a  OnlyOnce = 0;.}.
3d00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
3d10: 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41  EBUG /* sqlite3A
3d20: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3d30: 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  logic */../*.** 
3d40: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  The following ty
3d50: 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20  pe and function 
3d60: 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65 72  are used to iter
3d70: 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
3d80: 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20  opcodes.** in a 
3d90: 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61  Vdbe main progra
3da0: 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68  m and each of th
3db0: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28  e sub-programs (
3dc0: 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61 79  triggers) it may
3dd0: 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65   .** invoke dire
3de0: 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74  ctly or indirect
3df0: 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  ly. It should be
3e00: 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73   used as follows
3e10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f  :.**.**   Op *pO
3e20: 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74  p;.**   VdbeOpIt
3e30: 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20  er sIter;.**.** 
3e40: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
3e50: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
3e60: 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76  ));.**   sIter.v
3e70: 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20 20   = v;           
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65   // v is of type
3ea0: 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69   Vdbe* .**   whi
3eb0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
3ec0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20 29  rNext(&sIter)) )
3ed0: 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73  {.**     // Do s
3ee0: 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f  omething with pO
3ef0: 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71  p.**   }.**   sq
3f00: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
3f10: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
3f20: 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20  .** .*/.typedef 
3f30: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
3f40: 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74  r VdbeOpIter;.st
3f50: 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20  ruct VdbeOpIter 
3f60: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  {.  Vdbe *v;    
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f80: 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61 74  * Vdbe to iterat
3f90: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70  e through the op
3fa0: 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75  codes of */.  Su
3fb0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
3fc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
3fd0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
3fe0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20   */.  int nSub; 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
4010: 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a  tries in apSub *
4020: 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20  /.  int iAddr;  
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4040: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
4050: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4060: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
4070: 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   iSub;          
4080: 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d          /* 0 = m
4090: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d  ain program, 1 =
40a0: 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72   first sub-progr
40b0: 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74  am etc. */.};.st
40c0: 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e  atic Op *opIterN
40d0: 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a  ext(VdbeOpIter *
40e0: 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  p){.  Vdbe *v = 
40f0: 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74  p->v;.  Op *pRet
4100: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b   = 0;.  Op *aOp;
4110: 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69  .  int nOp;..  i
4120: 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e  f( p->iSub<=p->n
4130: 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20  Sub ){..    if( 
4140: 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20  p->iSub==0 ){.  
4150: 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70      aOp = v->aOp
4160: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d  ;.      nOp = v-
4170: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >nOp;.    }else{
4180: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e  .      aOp = p->
4190: 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d  apSub[p->iSub-1]
41a0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
41b0: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
41c0: 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub-1]->nOp;.   
41d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
41e0: 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a  ->iAddr<nOp );..
41f0: 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b      pRet = &aOp[
4200: 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70  p->iAddr];.    p
4210: 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69  ->iAddr++;.    i
4220: 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70  f( p->iAddr==nOp
4230: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75   ){.      p->iSu
4240: 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41  b++;.      p->iA
4250: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ddr = 0;.    }. 
4260: 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e   .    if( pRet->
4270: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
4280: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69  OGRAM ){.      i
4290: 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e  nt nByte = (p->n
42a0: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
42b0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
42c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
42d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75  or(j=0; j<p->nSu
42e0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
42f0: 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d   if( p->apSub[j]
4300: 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  ==pRet->p4.pProg
4310: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
4320: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4330: 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20  ==p->nSub ){.   
4340: 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20       p->apSub = 
4350: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
4360: 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d  OrFree(v->db, p-
4370: 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a  >apSub, nByte);.
4380: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e          if( !p->
4390: 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  apSub ){.       
43a0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
43b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
43c0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70        p->apSub[p
43d0: 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74  ->nSub++] = pRet
43e0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
43f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
4410: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
4420: 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
4430: 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20   program stored 
4440: 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69  in the VM associ
4450: 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73 65  ated with pParse
4460: 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e   may.** throw an
4470: 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e   ABORT exception
4480: 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73 74   (causing the st
4490: 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  atement, but not
44a0: 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
44b0: 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c  ion.** to be rol
44c0: 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20  led back). This 
44d0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
44e0: 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72  e if the main pr
44f0: 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20  ogram or any.** 
4500: 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e  sub-programs con
4510: 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65  tains any of the
4520: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
4530: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77  *   *  OP_Halt w
4540: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
4550: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
4560: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
4570: 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20    OP_HaltIfNull 
4580: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
4590: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
45a0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
45b0: 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a  *  OP_Destroy.**
45c0: 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65     *  OP_VUpdate
45d0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e  .**   *  OP_VRen
45e0: 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46  ame.**   *  OP_F
45f0: 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32  kCounter with P2
4600: 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66  ==0 (immediate f
4610: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
4620: 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f  raint).**   *  O
4630: 50 5f 43 72 65 61 74 65 42 74 72 65 65 2f 42 54  P_CreateBtree/BT
4640: 52 45 45 5f 49 4e 54 4b 45 59 20 61 6e 64 20 4f  REE_INTKEY and O
4650: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
4660: 0a 2a 2a 20 20 20 20 20 20 28 66 6f 72 20 43 52  .**      (for CR
4670: 45 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45  EATE TABLE AS SE
4680: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
4690: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
46a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
46b0: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
46c0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
46d0: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
46e0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
46f0: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
4700: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
4710: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
4720: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
4730: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
4740: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
4750: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
4760: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
4770: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
4780: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
4790: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
47a0: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
47b0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
47c0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
47d0: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
47e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
47f0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
4800: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
4810: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
4820: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  bort = 0;.  int 
4830: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30  hasFkCounter = 0
4840: 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74  ;.  int hasCreat
4850: 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  eTable = 0;.  in
4860: 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  t hasInitCorouti
4870: 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  ne = 0;.  Op *pO
4880: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
4890: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
48a0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
48b0: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
48c0: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
48d0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
48e0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
48f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
4900: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
4910: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
4920: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
4930: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
4940: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
4950: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
4960: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 44  || opcode==OP_VD
4970: 65 73 74 72 6f 79 0a 20 20 20 20 20 7c 7c 20 28  estroy.     || (
4980: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
4990: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
49a0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
49b0: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
49c0: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
49d0: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
49e0: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
49f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
4a00: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
4a10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a20: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4a30: 43 72 65 61 74 65 42 74 72 65 65 20 26 26 20 70  CreateBtree && p
4a40: 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e  Op->p3==BTREE_IN
4a50: 54 4b 45 59 20 29 20 68 61 73 43 72 65 61 74 65  TKEY ) hasCreate
4a60: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
4a70: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
4a80: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
4a90: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
4aa0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
4ab0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
4ac0: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
4ad0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
4ae0: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
4af0: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
4b00: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
4b10: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
4b20: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
4b30: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
4b40: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
4b50: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
4b60: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
4b70: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
4b80: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
4b90: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
4ba0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
4bb0: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
4bc0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
4bd0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
4be0: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
4bf0: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
4c00: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
4c10: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
4c20: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
4c30: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
4c40: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
4c50: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
4c60: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
4c70: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
4c80: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
4c90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4ca0: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
4cb0: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
4cc0: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
4cd0: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
4ce0: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
4cf0: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
4d00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4d10: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
4d20: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
4d30: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
4d40: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
4d50: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e  E_DEBUG./*.** In
4d60: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69  crement the nWri
4d70: 74 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68  te counter in th
4d80: 65 20 56 44 42 45 20 69 66 20 74 68 65 20 63 75  e VDBE if the cu
4d90: 72 73 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a  rsor is not an.*
4da0: 2a 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  * ephemeral curs
4db0: 6f 72 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75  or, or if the cu
4dc0: 72 73 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73  rsor argument is
4dd0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   NULL..*/.void s
4de0: 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72  qlite3VdbeIncrWr
4df0: 69 74 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20  iteCounter(Vdbe 
4e00: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
4e10: 70 43 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30  pC){.  if( pC==0
4e20: 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72  .   || (pC->eCur
4e30: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f  Type!=CURTYPE_SO
4e40: 52 54 45 52 0a 20 20 20 20 20 20 20 26 26 20 70  RTER.       && p
4e50: 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  C->eCurType!=CUR
4e60: 54 59 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20  TYPE_PSEUDO.    
4e70: 20 20 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68     && !pC->isEph
4e80: 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20  emeral).  ){.   
4e90: 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20   p->nWrite++;.  
4ea0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
4eb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4ec0: 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20  /*.** Assert if 
4ed0: 61 6e 20 41 62 6f 72 74 20 61 74 20 74 68 69 73  an Abort at this
4ee0: 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d   point in time m
4ef0: 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
4f00: 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61   corrupt.** data
4f10: 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
4f20: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41  lite3VdbeAssertA
4f30: 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70  bortable(Vdbe *p
4f40: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4f50: 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e  nWrite==0 || p->
4f60: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
4f70: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
4f80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4f90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
4fa0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
4fb0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
4fc0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
4fd0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
4fe0: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
4ff0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
5000: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
5010: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
5020: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
5030: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
5040: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
5050: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
5060: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
5070: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
5080: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
5090: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
50a0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
50b0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
50c0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
50d0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
50e0: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
50f0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
5100: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
5110: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
5120: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
5130: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
5140: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
5150: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
5160: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
5170: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
5180: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
5190: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
51a0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
51b0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
51c0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
51d0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
51e0: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
51f0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
5200: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
5210: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
5220: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
5230: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
5240: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
5250: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
5260: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
5270: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
5280: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
5290: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
52a0: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
52b0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
52c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
52d0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
52e0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
52f0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
5300: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
5310: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
5320: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
5330: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
5340: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
5350: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
5360: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
5370: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
5380: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
5390: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
53a0: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
53b0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
53c0: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
53d0: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
53e0: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
53f0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
5400: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
5410: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
5420: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
5430: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
5440: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
5450: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
5460: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
5470: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
5480: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
5490: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
54a0: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
54b0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
54c0: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
54d0: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
54e0: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
54f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
5500: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
5510: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
5520: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
5530: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
5540: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
5550: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
5560: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
5570: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
5580: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
5590: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
55a0: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
55b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
55c0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
55d0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
55e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
55f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
5600: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
5610: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
5620: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
5630: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
5640: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
5650: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
5660: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
5670: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
5680: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
5690: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
56a0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
56b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
56c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
56d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
56e0: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
56f0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
5700: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
5710: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
5720: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
5730: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
5740: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
5750: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
5760: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
5770: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
5780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5790: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
57a0: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
57b0: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
57c0: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
57d0: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
57e0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
57f0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
5800: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5810: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
5820: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
5830: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
5840: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
5850: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5860: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5870: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
5880: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
5890: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
58a0: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
58b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
58c0: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
58d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
58e0: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
58f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5910: 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a  case OP_Prev: {.
5920: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
5930: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
5940: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
5950: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  s;.          pOp
5960: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
5970: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20  VANCE;.         
5980: 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e   /* The code gen
5990: 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64  erator never cod
59a0: 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  es any of these 
59b0: 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d  opcodes as a jum
59c0: 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  p.          ** t
59d0: 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79  o a label.  They
59e0: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65   are always code
59f0: 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b  d as a jump back
5a00: 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20  wards to a .    
5a10: 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61        ** known a
5a20: 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ddress */.      
5a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5a40: 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  >p2>=0 );.      
5a50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5a60: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
5a70: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5a80: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61  TABLE.        ca
5a90: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
5aa0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5ab0: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
5ac0: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
5ad0: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
5ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5af0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5b00: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
5b10: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
5b20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5b30: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d  pOp - p->aOp) >=
5b40: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3 );.          
5b50: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
5b60: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
5b70: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er );.          
5b80: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
5b90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e            if( n>
5ba0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5bb0: 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  rgs = n;.       
5bc0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5bd0: 67 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61  gh into the defa
5be0: 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ult case */.    
5bf0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
5c00: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
5c10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
5c20: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
5c30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b         /* The mk
5c40: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69  opcodeh.tcl scri
5c50: 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67  pt has so arrang
5c60: 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74  ed things that t
5c70: 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  he only.        
5c80: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
5c90: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
5ca0: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5cb0: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
5cc0: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  teed to.        
5cd0: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
5ce0: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
5cf0: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
5d00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5d10: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5d20: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5d30: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
5d40: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
5d50: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28     assert( ADDR(
5d60: 70 4f 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73 65  pOp->p2)<-pParse
5d70: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
5d80: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
5d90: 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f  = aLabel[ADDR(pO
5da0: 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20  p->p2)];.       
5db0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
5dc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
5de0: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
5df0: 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f  cl script has so
5e00: 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73   arranged things
5e10: 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20   that the only. 
5e20: 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70       ** non-jump
5e30: 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68   opcodes less th
5e40: 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d  an SQLITE_MX_JUM
5e50: 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61  P_CODE are guara
5e60: 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a  nteed to.      *
5e70: 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74  * have non-negat
5e80: 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50  ive values for P
5e90: 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  2. */.      asse
5ea0: 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  rt( (sqlite3Opco
5eb0: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
5ec0: 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55  opcode]&OPFLG_JU
5ed0: 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  MP)==0 || pOp->p
5ee0: 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2>=0);.    }.   
5ef0: 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70   if( pOp==p->aOp
5f00: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f   ) break;.    pO
5f10: 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p--;.  }.  sqlit
5f20: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
5f30: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
5f40: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
5f50: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
5f60: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
5f70: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
5f80: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
5f90: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
5fa0: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
5fb0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
5fc0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
5fd0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
5fe0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
5ff0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
6000: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
6010: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6020: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
6030: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
6040: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
6050: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
6060: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
6070: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 74  * Verify that at
6080: 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20   least N opcode 
6090: 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61  slots are availa
60a0: 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74  ble in p without
60b0: 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61  .** having to ma
60c0: 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70  lloc for more sp
60d0: 61 63 65 20 28 65 78 63 65 70 74 20 77 68 65 6e  ace (except when
60e0: 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a   compiled using.
60f0: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ** SQLITE_TEST_R
6100: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20  EALLOC_STRESS). 
6110: 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   This interface 
6120: 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
6130: 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72  esting.** to ver
6140: 69 66 79 20 74 68 61 74 20 63 65 72 74 61 69 6e  ify that certain
6150: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
6160: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
6170: 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61   can never.** fa
6180: 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20  il due to a OOM 
6190: 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20  fault and hence 
61a0: 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 20  that the return 
61b0: 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71  value from.** sq
61c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
61d0: 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73  st() will always
61e0: 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f   be non-NULL..*/
61f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6200: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  ITE_DEBUG) && !d
6210: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
6220: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
6230: 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  S).void sqlite3V
6240: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
6250: 63 52 65 71 75 69 72 65 64 28 56 64 62 65 20 2a  cRequired(Vdbe *
6260: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
6270: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20  ert( p->nOp + N 
6280: 3c 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  <= p->nOpAlloc )
6290: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
62a0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
62b0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
62c0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
62d0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
62e0: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
62f0: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
6300: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
6310: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
6320: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
6330: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
6340: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
6350: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6360: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
6370: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
6380: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
6390: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
63a0: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
63b0: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
63c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
63d0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
63e0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
63f0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
6400: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
6410: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
6420: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6430: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6440: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
6450: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6460: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
6470: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
6480: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6490: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
64a0: 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72  a single OP_Abor
64b0: 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68  table opcode) th
64c0: 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66  at will.** verif
64d0: 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  y that the VDBE 
64e0: 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65  program can safe
64f0: 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e  ly call Abort in
6500: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
6510: 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20  context..*/.#if 
6520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6530: 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74  EBUG).void sqlit
6540: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
6550: 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69  table(Vdbe *p, i
6560: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69  nt onError){.  i
6570: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
6580: 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64  bort ) sqlite3Vd
6590: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41  beAddOp0(p, OP_A
65a0: 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e  bortable);.}.#en
65b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
65c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
65d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
65e0: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
65f0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
6600: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
6610: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
6620: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
6630: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
6640: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
6650: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
6660: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
6670: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
6680: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
6690: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
66a0: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
66b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
66c0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
66d0: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
66e0: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
66f0: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
6700: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
6710: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
6720: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
6730: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
6740: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
6750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
6760: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
6770: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
6780: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
6790: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
67a0: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
67b0: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
67c0: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
67d0: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
67e0: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
67f0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
6800: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
6810: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
6820: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6830: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
6840: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
6850: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
6860: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
6870: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
6880: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
6890: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
68a0: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
68b0: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
68c0: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
68d0: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
68e0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
68f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
6900: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
6910: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
6920: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
6930: 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   Return a.** poi
6940: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
6950: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
6960: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d  rted..**.** Non-
6970: 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74  zero P2 argument
6980: 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75  s to jump instru
6990: 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d  ctions are autom
69a0: 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65  atically adjuste
69b0: 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  d.** so that the
69c0: 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20   jump target is 
69d0: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
69e0: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
69f0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
6a00: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6a10: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
6a20: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6a40: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
6a50: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
6a60: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6a90: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
6aa0: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
6ab0: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
6ac0: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6ad0: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
6ae0: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
6b10: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
6b20: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
6b30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
6b40: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
6b50: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
6b60: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
6b70: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6b80: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6b90: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
6ba0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
6bb0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20   growOpArray(p, 
6bc0: 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nOp) ){.    retu
6bd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72  rn 0;.  }.  pFir
6be0: 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e  st = pOut = &p->
6bf0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66  aOp[p->nOp];.  f
6c00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
6c10: 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b  ++, aOp++, pOut+
6c20: 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70  +){.    pOut->op
6c30: 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f  code = aOp->opco
6c40: 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31  de;.    pOut->p1
6c50: 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20   = aOp->p1;.    
6c60: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e  pOut->p2 = aOp->
6c70: 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p2;.    assert( 
6c80: 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  aOp->p2>=0 );.  
6c90: 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70    if( (sqlite3Op
6ca0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70  codeProperty[aOp
6cb0: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
6cc0: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f  G_JUMP)!=0 && aO
6cd0: 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20  p->p2>0 ){.     
6ce0: 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e   pOut->p2 += p->
6cf0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nOp;.    }.    p
6d00: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70  Out->p3 = aOp->p
6d10: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  3;.    pOut->p4t
6d20: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
6d30: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70  ;.    pOut->p4.p
6d40: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
6d50: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
6d60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
6d70: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
6d80: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
6d90: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
6da0: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
6db0: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75  COVERAGE.    pOu
6dc0: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  t->iSrcLine = iL
6dd0: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20  ineno+i;.#else. 
6de0: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
6df0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
6e00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
6e10: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
6e20: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
6e30: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
6e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
6e50: 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f  intOp(0, i+p->nO
6e60: 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e  p, &p->aOp[i+p->
6e70: 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  nOp]);.    }.#en
6e80: 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70  dif.  }.  p->nOp
6e90: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72   += nOp;.  retur
6ea0: 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66  n pFirst;.}..#if
6eb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6ec0: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
6ed0: 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64  STATUS)./*.** Ad
6ee0: 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
6ef0: 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74  e array of count
6f00: 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73  ers managed by s
6f10: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
6f20: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69  status()..*/.voi
6f30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61  d sqlite3VdbeSca
6f40: 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20  nStatus(.  Vdbe 
6f50: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d             /* VM
6f70: 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74   to add scanstat
6f80: 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  us() to */.  int
6f90: 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20   addrExplain,   
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6fb0: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78  Address of OP_Ex
6fc0: 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a  plain (or 0) */.
6fd0: 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20    int addrLoop, 
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
7000: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20  loop counter */ 
7010: 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74  .  int addrVisit
7020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7030: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
7040: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f   rows visited co
7050: 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73  unter */.  LogEs
7060: 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20  t nEst,         
7070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
7080: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
7090: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f  f output rows */
70a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
70b0: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
70c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
70d0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69  ble or index bei
70e0: 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b  ng scanned */.){
70f0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28  .  int nByte = (
7100: 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69  p->nScan+1) * si
7110: 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29  zeof(ScanStatus)
7120: 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a  ;.  ScanStatus *
7130: 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28  aNew;.  aNew = (
7140: 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69  ScanStatus*)sqli
7150: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
7160: 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42  db, p->aScan, nB
7170: 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77  yte);.  if( aNew
7180: 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74   ){.    ScanStat
7190: 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77  us *pNew = &aNew
71a0: 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20  [p->nScan++];.  
71b0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c    pNew->addrExpl
71c0: 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69  ain = addrExplai
71d0: 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  n;.    pNew->add
71e0: 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70  rLoop = addrLoop
71f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
7200: 56 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69  Visit = addrVisi
7210: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73  t;.    pNew->nEs
7220: 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e  t = nEst;.    pN
7230: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ew->zName = sqli
7240: 74 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64  te3DbStrDup(p->d
7250: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
7260: 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a  ->aScan = aNew;.
7270: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
7280: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7290: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63  value of the opc
72a0: 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20  ode, or P1, P2, 
72b0: 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e  P3, or P5 operan
72c0: 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63  ds.** for a spec
72d0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
72e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
72f0: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
7300: 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  e(Vdbe *p, u32 a
7310: 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f  ddr, u8 iNewOpco
7320: 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  de){.  sqlite3Vd
7330: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
7340: 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70  >opcode = iNewOp
7350: 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  code;.}.void sql
7360: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
7370: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
7380: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
7390: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
73a0: 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76  (p,addr)->p1 = v
73b0: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
73c0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
73d0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
73e0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
73f0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
7400: 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c  ,addr)->p2 = val
7410: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
7420: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
7430: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
7440: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69  int val){.  sqli
7450: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
7460: 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a  ddr)->p3 = val;.
7470: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7480: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
7490: 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61  *p, u16 p5){.  a
74a0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
74b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
74c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
74d0: 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f  p->nOp>0 ) p->aO
74e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
74f0: 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   p5;.}../*.** Ch
7500: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
7510: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
7520: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
7530: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
7540: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
7550: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
7560: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
7570: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7580: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
7590: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
75a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
75b0: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
75c0: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
75d0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
75e0: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
75f0: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
7600: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
7610: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
7620: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
7630: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
7640: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
7650: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
7660: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
7670: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
7680: 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66  ef){.  if( (pDef
7690: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
76a0: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
76b0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
76c0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
76d0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Def);.  }.}..sta
76e0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
76f0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
7700: 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a   *, Op *, int);.
7710: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
7720: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
7730: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
7740: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
7750: 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28   void freeP4Mem(
7760: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d  sqlite3 *db, Mem
7770: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
7780: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
7790: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
77a0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74  Malloc);.  sqlit
77b0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
77c0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49  );.}.static SQLI
77d0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
77e0: 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 73   freeP4FuncCtx(s
77f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69  qlite3 *db, sqli
7800: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b  te3_context *p){
7810: 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  .  freeEphemeral
7820: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e  Function(db, p->
7830: 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33  pFunc);. sqlite3
7840: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
7850: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
7860: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
7870: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
7880: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65  oid *p4){.  asse
7890: 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74  rt( db );.  swit
78a0: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
78b0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
78c0: 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50  X: {.      freeP
78d0: 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71  4FuncCtx(db, (sq
78e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70  lite3_context*)p
78f0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
7900: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7910: 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73  P4_REAL:.    cas
7920: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
7930: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
7940: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e  .    case P4_DYN
7950: 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50  BLOB:.    case P
7960: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
7970: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7980: 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20  e(db, p4);.     
7990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
79a0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
79b0: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64  O: {.      if( d
79c0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
79d0: 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49  =0 ) sqlite3KeyI
79e0: 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66  nfoUnref((KeyInf
79f0: 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  o*)p4);.      br
7a00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  eak;.    }.#ifde
7a10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7a20: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
7a30: 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b   case P4_EXPR: {
7a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7a50: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78  prDelete(db, (Ex
7a60: 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  pr*)p4);.      b
7a70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
7a80: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46  if.    case P4_F
7a90: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
7aa0: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
7ab0: 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44  ction(db, (FuncD
7ac0: 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  ef*)p4);.      b
7ad0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7ae0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
7af0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
7b00: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
7b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7b20: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
7b30: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
7b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7b50: 20 20 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c     freeP4Mem(db,
7b60: 20 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20   (Mem*)p4);.    
7b70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7b80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7b90: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
7ba0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
7bb0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
7bc0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
7bd0: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
7be0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
7c00: 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  e the space allo
7c10: 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e  cated for aOp an
7c20: 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20  d any p4 values 
7c30: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
7c40: 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e  e.** opcodes con
7c50: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49  tained within. I
7c60: 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c  f aOp is not NUL
7c70: 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  L it is assumed 
7c80: 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e  to contain .** n
7c90: 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a  Op entries. .*/.
7ca0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
7cb0: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
7cc0: 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70  te3 *db, Op *aOp
7cd0: 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66  , int nOp){.  if
7ce0: 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20  ( aOp ){.    Op 
7cf0: 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f  *pOp;.    for(pO
7d00: 70 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70  p=&aOp[nOp-1]; p
7d10: 4f 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b  Op>=aOp; pOp--){
7d20: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
7d30: 70 34 74 79 70 65 20 3c 3d 20 50 34 5f 46 52 45  p4type <= P4_FRE
7d40: 45 5f 49 46 5f 4c 45 20 29 20 66 72 65 65 50 34  E_IF_LE ) freeP4
7d50: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
7d60: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
7d70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7d80: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
7d90: 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NTS.      sqlite
7da0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
7db0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64  >zComment);.#end
7dc0: 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  if     .    }.  
7dd0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
7de0: 4e 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a  N(db, aOp);.  }.
7df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68  }../*.** Link th
7e00: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  e SubProgram obj
7e10: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
7e20: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e30: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
7e40: 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62  d.** list at Vdb
7e50: 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54  e.pSubProgram. T
7e60: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
7e70: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
7e80: 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62  ub-program.** ob
7e90: 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56  jects when the V
7ea0: 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  M is no longer r
7eb0: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  equired..*/.void
7ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
7ed0: 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20  SubProgram(Vdbe 
7ee0: 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72  *pVdbe, SubProgr
7ef0: 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65  am *p){.  p->pNe
7f00: 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f  xt = pVdbe->pPro
7f10: 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70  gram;.  pVdbe->p
7f20: 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a  Program = p;.}..
7f30: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
7f40: 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20   opcode at addr 
7f50: 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a  into OP_Noop.*/.
7f60: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
7f70: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
7f80: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
7f90: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
7fa0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
7fb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
7fc0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  n 0;.  assert( a
7fd0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
7fe0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d  ->nOp );.  pOp =
7ff0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
8000: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
8010: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
8020: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
8030: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
8040: 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a  SED;.  pOp->p4.z
8050: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63   = 0;.  pOp->opc
8060: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
8070: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
8080: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20  .** If the last 
8090: 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61  opcode is "op" a
80a0: 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a  nd it is not a j
80b0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c  ump destination,
80c0: 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  .** then remove 
80d0: 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  it.  Return true
80e0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
80f0: 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65  an opcode was re
8100: 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
8110: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50  lite3VdbeDeleteP
8120: 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20  riorOpcode(Vdbe 
8130: 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66  *p, u8 op){.  if
8140: 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d  ( p->nOp>0 && p-
8150: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f  >aOp[p->nOp-1].o
8160: 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20  pcode==op ){.   
8170: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
8180: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
8190: 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20  p, p->nOp-1);.  
81a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
81b0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
81c0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
81d0: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
81e0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
81f0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
8200: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8210: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
8220: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
8230: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
8240: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
8250: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
8260: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
8270: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
8280: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
8290: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
82a0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
82b0: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
82c0: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
82d0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
82e0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
82f0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
8300: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
8310: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
8320: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
8330: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
8340: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
8350: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
8360: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
8370: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
8380: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
8390: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
83a0: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20   of zP4..** .** 
83b0: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
83c0: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
83d0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
83e0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
83f0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
8400: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
8410: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
8420: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
8430: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
8440: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
8450: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
8460: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
8470: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
8480: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
8490: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
84a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
84b0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
84c0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
84d0: 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f  c void SQLITE_NO
84e0: 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67  INLINE vdbeChang
84f0: 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20  eP4Full(.  Vdbe 
8500: 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20  *p,.  Op *pOp,. 
8510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
8520: 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69  ,.  int n.){.  i
8530: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  f( pOp->p4type )
8540: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
8550: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
8560: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
8570: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30   pOp->p4type = 0
8580: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
8590: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
85a0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
85b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c  3VdbeChangeP4(p,
85c0: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e   (int)(pOp - p->
85d0: 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  aOp), zP4, n);. 
85e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
85f0: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
8600: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
8610: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
8620: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8630: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
8640: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
8650: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
8660: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8670: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
8680: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
8690: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
86a0: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
86b0: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
86c0: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
86d0: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
86e0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
86f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
8700: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
8710: 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20  sert( p->aOp!=0 
8720: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
8730: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
8740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
8750: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
8760: 54 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c  TAB ) freeP4(db,
8770: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
8780: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72  r**)&zP4);.    r
8790: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
87a0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
87b0: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
87c0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
87d0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
87e0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
87f0: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
8800: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66  >aOp[addr];.  if
8810: 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  ( n>=0 || pOp->p
8820: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62  4type ){.    vdb
8830: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c  eChangeP4Full(p,
8840: 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20   pOp, zP4, n);. 
8850: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8860: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
8870: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
8880: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
8890: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
88a0: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
88b0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
88c0: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
88d0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
88e0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
88f0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
8900: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
8910: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
8920: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
8930: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30  }else if( zP4!=0
8940: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8950: 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 );.    pOp->
8960: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
8970: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
8980: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
8990: 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  r)n;.    if( n==
89a0: 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65  P4_VTAB ) sqlite
89b0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
89c0: 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  e*)zP4);.  }.}..
89d0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
89e0: 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74   P4 operand of t
89f0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8a00: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
8a10: 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  on .** to the va
8a20: 6c 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74  lue defined by t
8a30: 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  he arguments.  T
8a40: 68 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70  his is a high-sp
8a50: 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f  eed.** version o
8a60: 66 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  f sqlite3VdbeCha
8a70: 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ngeP4()..**.** T
8a80: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75  he P4 operand mu
8a90: 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  st not have been
8aa0: 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69   previously defi
8ab0: 6e 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65  ned.  And the ne
8ac0: 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74  w.** P4 must not
8ad0: 20 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55   be P4_INT32.  U
8ae0: 73 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  se sqlite3VdbeCh
8af0: 61 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68  angeP4() in eith
8b00: 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63  er of.** those c
8b10: 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ases..*/.void sq
8b20: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8b30: 34 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20  4(Vdbe *p, void 
8b40: 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *pP4, int n){.  
8b50: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61  VdbeOp *pOp;.  a
8b60: 73 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54  ssert( n!=P4_INT
8b70: 33 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  32 && n!=P4_VTAB
8b80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c   );.  assert( n<
8b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  =0 );.  if( p->d
8ba0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8bb0: 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d  ){.    freeP4(p-
8bc0: 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20  >db, n, pP4);.  
8bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8be0: 74 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20  t( pP4!=0 );.   
8bf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
8c00: 30 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26  0 );.    pOp = &
8c10: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
8c20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
8c30: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
8c40: 54 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70  TUSED );.    pOp
8c50: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
8c60: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50    pOp->p4.p = pP
8c70: 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  4;.  }.}../*.** 
8c80: 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68  Set the P4 on th
8c90: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8ca0: 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20  added opcode to 
8cb0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20  the KeyInfo for 
8cc0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76  the.** index giv
8cd0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
8ce0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
8cf0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
8d00: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
8d10: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
8d20: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65  rse->pVdbe;.  Ke
8d30: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
8d40: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
8d50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
8d60: 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e  x!=0 );.  pKeyIn
8d70: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
8d80: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
8d90: 65 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20  e, pIdx);.  if( 
8da0: 70 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74  pKeyInfo ) sqlit
8db0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
8dc0: 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  , pKeyInfo, P4_K
8dd0: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
8de0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8df0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
8e00: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
8e10: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
8e20: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8e30: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
8e40: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
8e50: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
8e60: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
8e70: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
8e80: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
8e90: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
8ea0: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
8eb0: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
8ec0: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
8ed0: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
8ee0: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
8ef0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
8f00: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
8f10: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
8f20: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
8f30: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
8f40: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
8f50: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
8f60: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
8f70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
8f80: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
8f90: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8fa0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
8fb0: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
8fc0: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
8fd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
8fe0: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
8ff0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
9000: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
9010: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
9020: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
9030: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
9040: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
9050: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
9060: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
9070: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
9080: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
9090: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
90a0: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
90b0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
90c0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
90d0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
90e0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
90f0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
9100: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
9110: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
9120: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
9130: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
9140: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
9150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9160: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
9170: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
9180: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
9190: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
91a0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
91b0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
91c0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
91d0: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
91e0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
91f0: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
9200: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
9210: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
9220: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
9230: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
9240: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
9250: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
9260: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
9270: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
9280: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
9290: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
92a0: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
92b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
92c0: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
92d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
92e0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
92f0: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
9300: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
9310: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
9320: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9330: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
9340: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
9350: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9360: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
9370: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
9380: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
9390: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
93a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
93b0: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
93c0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
93d0: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
93e0: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
93f0: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
9400: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
9410: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
9420: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
9430: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
9440: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
9450: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
9460: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
9470: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
9480: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
9490: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
94a0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
94b0: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
94c0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
94d0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
94e0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
94f0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
9500: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
9510: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
9520: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
9530: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
9540: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
9550: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
9560: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
9570: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
9580: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
9590: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
95a0: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
95b0: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
95c0: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
95d0: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
95e0: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
95f0: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
9600: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
9610: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
9620: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
9630: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
9640: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
9650: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
9660: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
9670: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9680: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
9690: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
96a0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
96b0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
96c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
96d0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
96e0: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
96f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9700: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
9710: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
9720: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
9730: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
9740: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
9750: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
9760: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
9770: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
9780: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
9790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
97a0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
97b0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
97c0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
97d0: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
97e0: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
97f0: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
9800: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
9810: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
9820: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
9830: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
9840: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
9850: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
9860: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
9870: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
9880: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
9890: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
98a0: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
98b0: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
98c0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
98d0: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
98e0: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
98f0: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
9900: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
9910: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
9920: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
9930: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
9940: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
9950: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
9960: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
9970: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
9980: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
9990: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
99a0: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
99b0: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
99c0: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
99d0: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
99e0: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
99f0: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
9a00: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
9a10: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
9a20: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
9a30: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
9a40: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
9a50: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
9a60: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
9a70: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
9a80: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
9a90: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
9aa0: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
9ab0: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
9ac0: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
9ad0: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
9ae0: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
9af0: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
9b00: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
9b10: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
9b20: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
9b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9b40: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
9b50: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
9b60: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
9b70: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
9b80: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
9b90: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
9ba0: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
9bb0: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
9bc0: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
9bd0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
9be0: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
9bf0: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
9c00: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
9c10: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
9c20: 20 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b    char zAlt[50];
9c30: 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  zOpName = sql
9c40: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
9c50: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e  Op->opcode);.  n
9c60: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
9c70: 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65  Strlen30(zOpName
9c80: 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65  );.  if( zOpName
9c90: 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20  [nOpName+1] ){. 
9ca0: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d     int seenCom =
9cb0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   0;.    char c;.
9cc0: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
9cd0: 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61  zOpName += nOpNa
9ce0: 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  me + 1;.    if( 
9cf0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
9d00: 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b  s,"IF ",3)==0 ){
9d10: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
9d20: 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52  p5 & SQLITE_STOR
9d30: 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EP2 ){.        s
9d40: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9d50: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9d60: 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73  lt, "r[P2] = (%s
9d70: 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29  )", zSynopsis+3)
9d80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9da0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
9db0: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20  Alt), zAlt, "if 
9dc0: 25 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79  %s goto P2", zSy
9dd0: 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20  nopsis+3);.     
9de0: 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73   }.      zSynops
9df0: 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d  is = zAlt;.    }
9e00: 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30  .    for(ii=jj=0
9e10: 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20  ; jj<nTemp-1 && 
9e20: 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69  (c = zSynopsis[i
9e30: 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20  i])!=0; ii++){. 
9e40: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20       if( c=='P' 
9e50: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  ){.        c = z
9e60: 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a  Synopsis[++ii];.
9e70: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
9e80: 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4' ){.          
9e90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9ea0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
9eb0: 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b  +jj, "%s", zP4);
9ec0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
9ed0: 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20  f( c=='X' ){.   
9ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9ef0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
9f00: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
9f10: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
9f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e  ;.          seen
9f30: 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Com = 1;.       
9f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9f50: 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73    int v1 = trans
9f60: 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20  lateP(c, pOp);. 
9f70: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b           int v2;
9f80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9f90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9fa0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
9fb0: 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20  "%d", v1);.     
9fc0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
9fd0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
9fe0: 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a   "@P", 2)==0 ){.
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
a000: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
a010: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
a020: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
a030: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32  ;.            v2
a040: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53   = translateP(zS
a050: 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70  ynopsis[ii], pOp
a060: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
a070: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
a080: 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32  psis+ii+1,"+1",2
a090: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
a0a0: 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20        ii += 2;. 
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b               v2+
a0c0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
a0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a0e0: 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20   v2>1 ){.       
a0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
a100: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
a110: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25  , zTemp+jj, "..%
a120: 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20  d", v1+v2-1);.  
a130: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a140: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a150: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
a160: 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20  s+ii+1, "..P3", 
a170: 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33  4)==0 && pOp->p3
a180: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a190: 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20     ii += 4;.    
a1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a1b0: 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20  }.        jj += 
a1c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a1d0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
a1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a1f0: 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b  zTemp[jj++] = c;
a200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a210: 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20     if( !seenCom 
a220: 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26  && jj<nTemp-5 &&
a230: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
a240: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a250: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
a260: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20  j, zTemp+jj, "; 
a270: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
a280: 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d  nt);.      jj +=
a290: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a2a0: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
a2b0: 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65  }.    if( jj<nTe
a2c0: 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d  mp ) zTemp[jj] =
a2d0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
a2e0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
a2f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
a300: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
a310: 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  mp, "%s", pOp->z
a320: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a  Comment);.    jj
a330: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a340: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  30(zTemp);.  }el
a350: 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d  se{.    zTemp[0]
a360: 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30   = 0;.    jj = 0
a370: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
a380: 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  j;.}.#endif /* S
a390: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
a3a0: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
a3b0: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
a3c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
a3d0: 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a  SOR_HINTS)./*.**
a3e0: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50   Translate the P
a3f0: 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f  4.pExpr value fo
a400: 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69  r an OP_CursorHi
a410: 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74  nt opcode into t
a420: 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  ext.** that can 
a430: 62 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20  be displayed in 
a440: 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66  the P4 column of
a450: 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e   EXPLAIN output.
a460: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a470: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74  displayP4Expr(St
a480: 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20  rAccum *p, Expr 
a490: 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74  *pExpr){.  const
a4a0: 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a   char *zOp = 0;.
a4b0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
a4c0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
a4d0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
a4e0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a4f0: 65 6e 64 66 28 70 2c 20 22 25 51 22 2c 20 70 45  endf(p, "%Q", pE
a500: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
a510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a520: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
a530: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
a540: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  str_appendf(p, "
a550: 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56  %d", pExpr->u.iV
a560: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
a570: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a580: 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69  NULL:.      sqli
a590: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a5a0: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
a5b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a5c0: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
a5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a5e0: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72  tr_appendf(p, "r
a5f0: 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54  [%d]", pExpr->iT
a600: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
a610: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a620: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
a630: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a640: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
a650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a660: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 6f  r_appendf(p, "ro
a670: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
a680: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a690: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a6a0: 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70  p, "c%d", (int)p
a6b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
a6c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a6d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a6e0: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
a6f0: 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20  zOp = "LT";     
a700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a710: 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70   TK_LE:      zOp
a720: 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72   = "LE";      br
a730: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a740: 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _GT:      zOp = 
a750: 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "GT";      break
a760: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
a770: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45  :      zOp = "GE
a780: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a790: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
a7a0: 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20      zOp = "NE"; 
a7b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a7c0: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
a7d0: 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20   zOp = "EQ";    
a7e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a7f0: 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f  e TK_IS:      zO
a800: 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62  p = "IS";      b
a810: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a820: 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d  K_ISNOT:   zOp =
a830: 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61   "ISNOT";   brea
a840: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  k;.    case TK_A
a850: 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41  ND:     zOp = "A
a860: 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ND";     break;.
a870: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
a880: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b       zOp = "OR";
a890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a8a0: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
a8b0: 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20    zOp = "ADD";  
a8c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a8d0: 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a  se TK_STAR:    z
a8e0: 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20  Op = "MUL";     
a8f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a900: 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20  TK_MINUS:   zOp 
a910: 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65  = "SUB";     bre
a920: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a930: 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  REM:     zOp = "
a940: 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  REM";     break;
a950: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a960: 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  AND:  zOp = "BIT
a970: 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  AND";  break;.  
a980: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
a990: 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22     zOp = "BITOR"
a9a0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
a9b0: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20  ase TK_SLASH:   
a9c0: 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20  zOp = "DIV";    
a9d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a9e0: 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70   TK_LSHIFT:  zOp
a9f0: 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72   = "LSHIFT";  br
aa00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
aa10: 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _RSHIFT:  zOp = 
aa20: 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "RSHIFT";  break
aa30: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
aa40: 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f  NCAT:  zOp = "CO
aa50: 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NCAT";  break;. 
aa60: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
aa70: 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53  S:  zOp = "MINUS
aa80: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
aa90: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20  case TK_UPLUS:  
aaa0: 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20   zOp = "PLUS";  
aab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aac0: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f  e TK_BITNOT:  zO
aad0: 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62  p = "BITNOT";  b
aae0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aaf0: 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d  K_NOT:     zOp =
ab00: 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61   "NOT";     brea
ab10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
ab20: 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49  SNULL:  zOp = "I
ab30: 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a  SNULL";  break;.
ab40: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
ab50: 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e  ULL: zOp = "NOTN
ab60: 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ULL"; break;..  
ab70: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
ab80: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ab90: 65 6e 64 66 28 70 2c 20 22 25 73 22 2c 20 22 65  endf(p, "%s", "e
aba0: 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65  xpr");.      bre
abb0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a  ak;.  }..  if( z
abc0: 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
abd0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c  3_str_appendf(p,
abe0: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
abf0: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28    displayP4Expr(
ac00: 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  p, pExpr->pLeft)
ac10: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
ac20: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
ac30: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ac40: 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a  end(p, ",", 1);.
ac50: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
ac60: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52  xpr(p, pExpr->pR
ac70: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
ac80: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ac90: 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a  end(p, ")", 1);.
aca0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
acb0: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
acc0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
acd0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
ace0: 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20  HINTS) */...#if 
acf0: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a  VDBE_DISPLAY_P4.
ad00: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
ad10: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
ad20: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
ad30: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
ad40: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
ad50: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
ad60: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
ad70: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
ad80: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
ad90: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
ada0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
adb0: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
adc0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53  zP4 = zTemp;.  S
add0: 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73  trAccum x;.  ass
ade0: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
adf0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
ae00: 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a  cumInit(&x, 0, z
ae10: 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b  Temp, nTemp, 0);
ae20: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
ae30: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
ae40: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
ae50: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
ae60: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
ae70: 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
ae80: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
ae90: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
aea0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
aeb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aec0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
aed0: 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66   "k(%d", pKeyInf
aee0: 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a 20  o->nKeyField);. 
aef0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
af00: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
af10: 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  eld; j++){.     
af20: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
af30: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
af40: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
af50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
af60: 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c  l = pColl ? pCol
af70: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20  l->zName : "";. 
af80: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
af90: 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59  p(zColl, "BINARY
afa0: 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20  ")==0 ) zColl = 
afb0: 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  "B";.        sql
afc0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
afd0: 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 0a 20  (&x, ",%s%s", . 
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
aff0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
b000: 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22  er[j] ? "-" : ""
b010: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
b020: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
b030: 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22  str_append(&x, "
b040: 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  )", 1);.      br
b050: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  eak;.    }.#ifde
b060: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b070: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
b080: 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b   case P4_EXPR: {
b090: 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34  .      displayP4
b0a0: 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34  Expr(&x, pOp->p4
b0b0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62  .pExpr);.      b
b0c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b0d0: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43  if.    case P4_C
b0e0: 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20  OLLSEQ: {.      
b0f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
b100: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a   pOp->p4.pColl;.
b110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b120: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 28  r_appendf(&x, "(
b130: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
b140: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
b150: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b160: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
b170: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
b180: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
b190: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
b1a0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b1b0: 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70  (&x, "%s(%d)", p
b1c0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
b1d0: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20  reak;.    }.#if 
b1f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
b200: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
b210: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20  (VDBE_PROFILE). 
b220: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43     case P4_FUNCC
b230: 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  TX: {.      Func
b240: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
b250: 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b  >p4.pCtx->pFunc;
b260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b270: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b280: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
b290: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
b2a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b2b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b2c0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
b2d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b2e0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b2f0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
b300: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
b310: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b320: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
b330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b340: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b350: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
b360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b370: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
b380: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
b390: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b3a0: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  (&x, "%.16g", *p
b3b0: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
b3c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3d0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
b3e0: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
b3f0: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
b400: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
b410: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
b420: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
b430: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
b440: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
b450: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
b460: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
b470: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b480: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
b490: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
b4a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
b4b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
b4c0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
b4d0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b4e0: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70  f(&x, "%.16g", p
b4f0: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Mem->u.r);.     
b500: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
b510: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
b520: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  l ){.        zP4
b530: 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20   = "NULL";.     
b540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b550: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
b560: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
b570: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
b580: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
b590: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b5a0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
b5b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
b5c0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
b5d0: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
b5e0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
b5f0: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
b600: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
b610: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
b620: 70 65 6e 64 66 28 26 78 2c 20 22 76 74 61 62 3a  pendf(&x, "vtab:
b630: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
b640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b650: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
b660: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
b670: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b680: 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d    int *ai = pOp-
b690: 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e  >p4.ai;.      in
b6a0: 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f  t n = ai[0];   /
b6b0: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
b6c0: 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52  ent of an INTARR
b6d0: 41 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  AY is always the
b6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b6f0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74          ** count
b700: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b710: 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f  f elements to fo
b720: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f  llow */.      fo
b730: 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b  r(i=1; i<=n; i++
b740: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b750: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b760: 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29  x, ",%d", ai[i])
b770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b780: 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a  zTemp[0] = '[';.
b790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b7a0: 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 5d 22  r_append(&x, "]"
b7b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
b7c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b7d0: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
b7e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b7f0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b800: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
b810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b820: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42      case P4_DYNB
b830: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34  LOB:.    case P4
b840: 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20  _ADVANCE: {.    
b850: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
b860: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b870: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54   }.    case P4_T
b880: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
b890: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b8a0: 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d  f(&x, "%s", pOp-
b8b0: 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  >p4.pTab->zName)
b8c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b8d0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
b8e0: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
b8f0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
b900: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
b910: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
b920: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
b930: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
b940: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
b950: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
b960: 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72  ish(&x);.  asser
b970: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
b980: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
b990: 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50  dif /* VDBE_DISP
b9a0: 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LAY_P4 */../*.**
b9b0: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
b9c0: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
b9d0: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
b9e0: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
b9f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70  ..**.** The prep
ba00: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
ba10: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20  need to know in 
ba20: 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70  advance the comp
ba30: 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61  lete set of.** a
ba40: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
ba50: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  s that will be u
ba60: 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  se.  A mask of t
ba70: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
ba80: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
ba90: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e  in p->btreeMask.
baa0: 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73    The p->lockMas
bab0: 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  k value is the s
bac0: 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62  ubset of.** p->b
bad0: 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61  treeMask of data
bae0: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
baf0: 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a  require a lock..
bb00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
bb10: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
bb20: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
bb30: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
bb40: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
bb50: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44  i<(int)sizeof(yD
bb60: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
bb70: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
bb80: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
bb90: 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53  )*8 );.  DbMaskS
bba0: 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  et(p->btreeMask,
bbb0: 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20   i);.  if( i!=1 
bbc0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  && sqlite3BtreeS
bbd0: 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61  harable(p->db->a
bbe0: 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20  Db[i].pBt) ){.  
bbf0: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c    DbMaskSet(p->l
bc00: 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d  ockMask, i);.  }
bc10: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
bc20: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
bc30: 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a  RED_CACHE)./*.**
bc40: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
bc50: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
bc60: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
bc70: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
bc80: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
bc90: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
bca0: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
bcb0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
bcc0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
bcd0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
bce0: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
bcf0: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
bd00: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
bd10: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
bd20: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
bd30: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
bd40: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
bd50: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
bd60: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
bd70: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
bd80: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
bd90: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
bda0: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
bdb0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
bdc0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
bdd0: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
bde0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
bdf0: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
be00: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
be10: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
be20: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
be30: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
be40: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
be50: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
be60: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
be70: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
be80: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
be90: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
bea0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
beb0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
bec0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
bed0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
bee0: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
bef0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
bf00: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
bf10: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
bf20: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
bf30: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
bf40: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
bf50: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
bf60: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
bf70: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
bf80: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
bf90: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
bfa0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
bfb0: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
bfc0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
bfd0: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
bfe0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
bff0: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
c000: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
c010: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
c020: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
c030: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
c040: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
c050: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
c060: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
c070: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
c080: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
c090: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
c0a0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
c0b0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
c0c0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
c0d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
c0e0: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
c0f0: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
c100: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
c110: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
c120: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
c130: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
c140: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
c150: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
c160: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c170: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
c180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
c190: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
c1a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
c1b0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
c1c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
c1d0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
c1e0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
c1f0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
c200: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
c210: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
c220: 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  r()..*/.static S
c230: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
c240: 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64  oid vdbeLeave(Vd
c250: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
c260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c270: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
c280: 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   nDb;.  db = p->
c290: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
c2a0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
c2b0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
c2c0: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
c2d0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
c2e0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
c2f0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
c300: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
c310: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c320: 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b  3BtreeLeave(aDb[
c330: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
c340: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
c350: 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20  3VdbeLeave(Vdbe 
c360: 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73  *p){.  if( DbMas
c370: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b  kAllZero(p->lock
c380: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20  Mask) ) return; 
c390: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
c3a0: 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61  ase */.  vdbeLea
c3b0: 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ve(p);.}.#endif.
c3c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
c3d0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
c3e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
c3f0: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
c400: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
c410: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
c420: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
c430: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
c440: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
c450: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
c460: 2c 20 69 6e 74 20 70 63 2c 20 56 64 62 65 4f 70  , int pc, VdbeOp
c470: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
c480: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
c490: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f  [50];.  char zCo
c4a0: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63  m[100];.  static
c4b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
c4c0: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
c4d0: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
c4e0: 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  -13s %.2X %s\n";
c4f0: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
c500: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
c510: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
c520: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
c530: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64  eof(zPtr));.#ifd
c540: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c550: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
c560: 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  S.  displayComme
c570: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f  nt(pOp, zP4, zCo
c580: 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29  m, sizeof(zCom))
c590: 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30  ;.#else.  zCom[0
c5a0: 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  ] = 0;.#endif.  
c5b0: 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69  /* NB:  The sqli
c5c0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20  te3OpcodeName() 
c5d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
c5e0: 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20  emented by code 
c5f0: 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20  created.  ** by 
c600: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
c610: 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e  k and mkopcodec.
c620: 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63  awk scripts whic
c630: 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20  h extract the.  
c640: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
c650: 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73  rom the vdbe.c s
c660: 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20  ource text */.  
c670: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
c680: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
c690: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
c6a0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
c6b0: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
c6c0: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
c6d0: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20  4, pOp->p5,.    
c6e0: 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66    zCom.  );.  ff
c6f0: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
c700: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
c710: 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20  ialize an array 
c720: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
c730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c740: 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65   initMemArray(Me
c750: 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c  m *p, int N, sql
c760: 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c  ite3 *db, u16 fl
c770: 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28  ags){.  while( (
c780: 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d  N--)>0 ){.    p-
c790: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
c7a0: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
c7b0: 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20      p->szMalloc 
c7c0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
c7d0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e  TE_DEBUG.    p->
c7e0: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
c7f0: 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a  #endif.    p++;.
c800: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
c810: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
c820: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
c830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
c840: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
c850: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
c860: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
c870: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26     Mem *pEnd = &
c880: 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  p[N];.    sqlite
c890: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
c8a0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
c8b0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
c8c0: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
c8d0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
c8e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c8f0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
c900: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
c910: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
c920: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
c930: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
c940: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
c950: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
c960: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
c970: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
c980: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
c990: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
c9a0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
c9b0: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
c9c0: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
c9d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
c9e0: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
c9f0: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
ca00: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
ca10: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
ca20: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
ca30: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
ca40: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
ca50: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
ca60: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
ca70: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
ca80: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
ca90: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
caa0: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
cab0: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
cac0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
cad0: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
cae0: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
caf0: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
cb00: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
cb10: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
cb20: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
cb30: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
cb40: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
cb50: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
cb60: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
cb70: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
cb80: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
cb90: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
cba0: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
cbb0: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
cbc0: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
cbd0: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
cbe0: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
cbf0: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
cc00: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
cc10: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
cc20: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
cc30: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
cc40: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
cc50: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
cc60: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
cc70: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
cc80: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
cc90: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
cca0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
ccb0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
ccc0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ccd0: 70 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69 74 65 33  p->xDel==sqlite3
cce0: 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 20  VdbeFrameMemDel 
ccf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
cd00: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
cd10: 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20  EM_Dyn) ){.     
cd20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
cd30: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
cd40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
cd50: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
cd60: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
cd70: 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  eNN(db, p->zMall
cd80: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
cd90: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
cda0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
cdb0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
cdc0: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c  fined;.    }whil
cdd0: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
cde0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53  .  }.}..#ifdef S
cdf0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
ce00: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 70 46  * Verify that pF
ce10: 72 61 6d 65 20 69 73 20 61 20 76 61 6c 69 64 20  rame is a valid 
ce20: 56 64 62 65 46 72 61 6d 65 20 70 6f 69 6e 74 65  VdbeFrame pointe
ce30: 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  r.  Return true 
ce40: 69 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 64 20  if it is.** and 
ce50: 66 61 6c 73 65 20 69 66 20 73 6f 6d 65 74 68 69  false if somethi
ce60: 6e 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a  ng is wrong..**.
ce70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ce80: 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  is intended for 
ce90: 75 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73  use inside of as
cea0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
ceb0: 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  s only..*/.int s
cec0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49  qlite3VdbeFrameI
ced0: 73 56 61 6c 69 64 28 56 64 62 65 46 72 61 6d 65  sValid(VdbeFrame
cee0: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69 66 28   *pFrame){.  if(
cef0: 20 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65 4d   pFrame->iFrameM
cf00: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 46 52 41  agic!=SQLITE_FRA
cf10: 4d 45 5f 4d 41 47 49 43 20 29 20 72 65 74 75 72  ME_MAGIC ) retur
cf20: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
cf30: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
cf40: 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 73 74  * This is a dest
cf50: 72 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65 6d 20  ructor on a Mem 
cf60: 6f 62 6a 65 63 74 20 28 77 68 69 63 68 20 69 73  object (which is
cf70: 20 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c 69 74   really an sqlit
cf80: 65 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74 68 61  e3_value).** tha
cf90: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 46 72  t deletes the Fr
cfa0: 61 6d 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ame object that 
cfb0: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  is attached to i
cfc0: 74 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a 2a 0a  t as a blob..**.
cfd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cfe0: 64 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74 65 20  does not delete 
cff0: 74 68 65 20 46 72 61 6d 65 20 72 69 67 68 74 20  the Frame right 
d000: 61 77 61 79 2e 20 20 49 74 20 6d 65 72 65 6c 79  away.  It merely
d010: 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 66 72 61   adds the.** fra
d020: 6d 65 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20  me to a list of 
d030: 66 72 61 6d 65 73 20 74 6f 20 62 65 20 64 65 6c  frames to be del
d040: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  eted when the Vd
d050: 62 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76 6f 69  be halts..*/.voi
d060: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
d070: 6d 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20 2a 70  meMemDel(void *p
d080: 41 72 67 29 7b 0a 20 20 56 64 62 65 46 72 61 6d  Arg){.  VdbeFram
d090: 65 20 2a 70 46 72 61 6d 65 20 3d 20 28 56 64 62  e *pFrame = (Vdb
d0a0: 65 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a 20 20  eFrame*)pArg;.  
d0b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
d0c0: 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28  dbeFrameIsValid(
d0d0: 70 46 72 61 6d 65 29 20 29 3b 0a 20 20 70 46 72  pFrame) );.  pFr
d0e0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  ame->pParent = p
d0f0: 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72  Frame->v->pDelFr
d100: 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 76  ame;.  pFrame->v
d110: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 46  ->pDelFrame = pF
d120: 72 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rame;.}.../*.** 
d130: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
d140: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
d150: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
d160: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
d170: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
d180: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
d190: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
d1a0: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
d1b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d1c0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
d1d0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
d1e0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
d1f0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
d200: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
d210: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
d220: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
d230: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
d240: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d250: 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64  VdbeFrameIsValid
d260: 28 70 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  (p) );.  for(i=0
d270: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
d280: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
d290: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
d2a0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
d2b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
d2c0: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
d2d0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
d2e0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
d2f0: 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64  eAuxData(p->v->d
d300: 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c  b, &p->pAuxData,
d310: 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   -1, 0);.  sqlit
d320: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
d330: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
d340: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
d350: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
d360: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
d370: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
d380: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
d390: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
d3a0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
d3b0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
d3c0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
d3d0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
d3e0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
d3f0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
d400: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
d410: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
d420: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
d430: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
d440: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
d450: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
d460: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
d470: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
d480: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
d490: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
d4a0: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
d4b0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
d4c0: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
d4d0: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
d4e0: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
d4f0: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
d500: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
d510: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
d520: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
d530: 2a 20 32 30 31 38 2d 30 34 2d 32 34 3a 20 20 49  * 2018-04-24:  I
d540: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  n p->explain==2 
d550: 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69  mode, the OP_Ini
d560: 74 20 6f 70 63 6f 64 65 73 20 6f 66 20 74 72 69  t opcodes of tri
d570: 67 67 65 72 73 0a 2a 2a 20 61 72 65 20 61 6c 73  ggers.** are als
d580: 6f 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68 61 74  o shown, so that
d590: 20 74 68 65 20 62 6f 75 6e 64 61 72 69 65 73 20   the boundaries 
d5a0: 62 65 74 77 65 65 6e 20 74 68 65 20 6d 61 69 6e  between the main
d5b0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a 20   program and.** 
d5c0: 65 61 63 68 20 74 72 69 67 67 65 72 20 61 72 65  each trigger are
d5d0: 20 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68   clear..**.** Wh
d5e0: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
d5f0: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
d600: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
d610: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
d620: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
d630: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
d640: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
d650: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d660: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
d670: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
d680: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
d690: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
d6a0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
d6d0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
d6e0: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
d6f0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d710: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
d720: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
d730: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
d740: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
d750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d760: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
d770: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
d780: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
d790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
d7a0: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
d7b0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
d7c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
d7d0: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
d7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d7f0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d800: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
d810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d840: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
d850: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
d860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d870: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
d880: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
d890: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
d8a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
d8b0: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
d8c0: 0a 20 20 69 6e 74 20 62 4c 69 73 74 53 75 62 70  .  int bListSubp
d8d0: 72 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61  rogs = (p->expla
d8e0: 69 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c  in==1 || (db->fl
d8f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54 72 69  ags & SQLITE_Tri
d900: 67 67 65 72 45 51 50 29 21 3d 30 29 3b 0a 20 20  ggerEQP)!=0);.  
d910: 4f 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20  Op *pOp = 0;..  
d920: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
d930: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
d940: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
d950: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
d960: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
d970: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
d980: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
d990: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
d9a0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
d9b0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
d9c0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
d9d0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
d9e0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
d9f0: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
da00: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
da10: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
da20: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
da30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
da40: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
da50: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
da60: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
da70: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
da80: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
da90: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
daa0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
dab0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
dac0: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
dad0: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
dae0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
daf0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
db00: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
db10: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
db20: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
db30: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
db40: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
db50: 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  t(db);.    retur
db60: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
db70: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
db80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
db90: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
dba0: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
dbb0: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
dbc0: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
dbd0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
dbe0: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
dbf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
dc00: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
dc10: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
dc20: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
dc30: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
dc40: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
dc50: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
dc60: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
dc70: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
dc80: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
dc90: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
dca0: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
dcb0: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
dcc0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
dcd0: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
dce0: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
dcf0: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
dd00: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
dd10: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
dd20: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
dd30: 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 29   bListSubprogs )
dd40: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
dd50: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
dd60: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
dd70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
dd80: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
dd90: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
dda0: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
ddb0: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
ddc0: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
ddd0: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
dde0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
ddf0: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
de00: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
de10: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
de20: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
de30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
de40: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
de50: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
de60: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
de70: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
de80: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
de90: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
dea0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
deb0: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
dec0: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
ded0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
dee0: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
def0: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
df00: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
df10: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
df20: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
df30: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
df40: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
df50: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
df60: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
df70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
df80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
df90: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
dfa0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
dfb0: 20 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20 4c   while(1){  /* L
dfc0: 6f 6f 70 20 65 78 69 74 73 20 76 69 61 20 62 72  oop exits via br
dfd0: 65 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d 20 70  eak */.    i = p
dfe0: 2d 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ->pc++;.    if( 
dff0: 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20  i>=nRow ){.     
e000: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
e010: 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  OK;.      rc = S
e020: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
e030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e040: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
e050: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
e060: 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62  output line numb
e070: 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  er is small enou
e080: 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73  gh that we are s
e090: 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20  till in the.    
e0a0: 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61    ** main progra
e0b0: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20  m. */.      pOp 
e0c0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
e0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
e0e0: 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74  * We are current
e0f0: 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72  ly listing subpr
e100: 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20  ograms.  Figure 
e110: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e  out which one an
e120: 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20  d.      ** pick 
e130: 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  up the appropria
e140: 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  te opcode. */.  
e150: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
e160: 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20   i -= p->nOp;.  
e170: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d      for(j=0; i>=
e180: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a  apSub[j]->nOp; j
e190: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d  ++){.        i -
e1a0: 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  = apSub[j]->nOp;
e1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e1c0: 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e  Op = &apSub[j]->
e1d0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20  aOp[i];.    }.. 
e1e0: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
e1f0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
e200: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
e210: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
e220: 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 61 20  at has.    ** a 
e230: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
e240: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
e250: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e260: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
e270: 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65 70 74  rams.    ** kept
e280: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
e290: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
e2a0: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
e2b0: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
e2c0: 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ram.    ** has n
e2d0: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
e2e0: 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  seen..    */.   
e2f0: 20 69 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f   if( bListSubpro
e300: 67 73 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70  gs && pOp->p4typ
e310: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
e320: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
e330: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
e340: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
e350: 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  *);.      int j;
e360: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
e370: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
e380: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
e390: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
e3a0: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
e3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e3c0: 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  j==nSub ){.     
e3d0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
e3e0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
e3f0: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
e400: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
e410: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
e420: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
e430: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
e440: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
e450: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e460: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
e470: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
e480: 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61 70 53  ->z;.        apS
e490: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
e4a0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
e4b0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
e4c0: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
e4d0: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
e4e0: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
e4f0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
e500: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d      nRow += pOp-
e510: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  >p4.pProgram->nO
e520: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
e530: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
e540: 61 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b 0a 20  ain<2 ) break;. 
e550: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
e560: 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de==OP_Explain )
e570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
e580: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
e590: 49 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e 31 20  Init && p->pc>1 
e5a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
e5b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e5c0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  K ){.    if( db-
e5d0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
e5e0: 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  d ){.      p->rc
e5f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
e600: 55 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  UPT;.      rc = 
e610: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
e620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
e630: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
e640: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
e650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e660: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 20  char *zP4;.     
e670: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
e680: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =1 ){.        pM
e690: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e6a0: 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  Int;.        pMe
e6b0: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
e6e0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
e6f0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  .        pMem++;
e700: 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 70 4d  .    .        pM
e710: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e720: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
e730: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
e740: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
e750: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
e760: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
e770: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
e780: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e790: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
e7a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
e7b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
e7c0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
e7d0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
e7e0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
e7f0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20    pMem++;.      
e800: 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  }..      pMem->f
e810: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
e820: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
e830: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
e860: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
e870: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e880: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
e890: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
e8a0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8c0: 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P2 */.      pMem
e8d0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ++;..      pMem-
e8e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e8f0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
e900: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
e930: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
e940: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
e950: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
e960: 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20  size(pMem, 100) 
e970: 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20  ){ /* P4 */.    
e980: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
e990: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e9a0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
e9b0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
e9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
e9d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e9e0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
e9f0: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
ea00: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
ea10: 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  , pMem->szMalloc
ea20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  );.      if( zP4
ea30: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
ea40: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30       pMem->n = 0
ea50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ea60: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
ea70: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
ea80: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
ea90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eaa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
eab0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
eac0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
ead0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
eae0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
eaf0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
eb00: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 7d 0a 20  _UTF8;.      }. 
eb10: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
eb20: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
eb30: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  in==1 ){.       
eb40: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
eb50: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
eb60: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
eb70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
eb80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
eb90: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  led );.         
eba0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
ebb0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
ebc0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
ebd0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
ebe0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
ebf0: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
ec00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
ec10: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
ec20: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
ec30: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
ec40: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
ec50: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ec60: 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a          pMem++;.
ec70: 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
ec80: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
ec90: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
eca0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
ecb0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
ecc0: 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29  ize(pMem, 500) )
ecd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
ece0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
ecf0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
ed00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ed10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
ed20: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    }.        pMem
ed30: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
ed40: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
ed50: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
ed60: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
ed70: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
ed80: 35 30 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  500);.        pM
ed90: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
eda0: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
edb0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
edc0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
edf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
ee00: 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  .      p->nResCo
ee10: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
ee20: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
ee30: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
ee40: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
ee50: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
ee60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72  LITE_OK;.      r
ee70: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
ee80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ee90: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
eea0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
eeb0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
eec0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
eed0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
eee0: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
eef0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
ef00: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
ef10: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ef20: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
ef30: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
ef40: 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  *z = 0;.  if( p-
ef50: 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d  >zSql ){.    z =
ef60: 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73   p->zSql;.  }els
ef70: 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20  e if( p->nOp>=1 
ef80: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62  ){.    const Vdb
ef90: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
efa0: 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  Op[0];.    if( p
efb0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
efc0: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
efd0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  !=0 ){.      z =
efe0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
eff0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
f000: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
f010: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
f020: 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53  f( z ) printf("S
f030: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
f040: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
f050: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f060: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
f070: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
f080: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
f090: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
f0a0: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
f0b0: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
f0c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f0d0: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
f0e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
f0f0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
f100: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
f110: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
f120: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f130: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
f140: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
f150: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
f160: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
f170: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
f180: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
f190: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
f1a0: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
f1b0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
f1c0: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
f1d0: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
f1e0: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
f1f0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
f200: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
f210: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
f220: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
f230: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
f240: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
f250: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
f260: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
f270: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
f280: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f290: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
f2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f2b0: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
f2c0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
f2d0: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
f2e0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
f2f0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
f300: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
f310: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
f320: 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
f330: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65  f this object de
f340: 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d  scribes bulk mem
f350: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
f360: 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63  r use.** by subc
f370: 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70  omponents of a p
f380: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
f390: 74 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c  t.  Space is all
f3a0: 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66  ocated out.** of
f3b0: 20 61 20 52 65 75 73 61 62 6c 65 53 70 61 63 65   a ReusableSpace
f3c0: 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20 61   object by the a
f3d0: 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74  llocSpace() rout
f3e0: 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74  ine below..*/.st
f3f0: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
f400: 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63  ce {.  u8 *pSpac
f410: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  e;          /* A
f420: 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20  vailable memory 
f430: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
f440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
f450: 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
f460: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
f470: 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20 20  nNeeded;        
f480: 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20   /* Total bytes 
f490: 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  that could not b
f4a0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d  e allocated */.}
f4b0: 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c  ;../* Try to all
f4c0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
f4d0: 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  s of 8-byte alig
f4e0: 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  ned bulk memory 
f4f0: 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d  for pBuf.** from
f500: 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61   the ReusableSpa
f510: 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75  ce object.  Retu
f520: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
f530: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  the allocated.**
f540: 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65   memory on succe
f550: 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63  ss.  If insuffic
f560: 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61  ient memory is a
f570: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a  vailable in the.
f580: 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ** ReusableSpace
f590: 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73   object, increas
f5a0: 65 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70  e the ReusableSp
f5b0: 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76  ace.nNeeded.** v
f5c0: 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75  alue by the amou
f5d0: 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65  nt needed and re
f5e0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
f5f0: 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20   If pBuf is not 
f600: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
f610: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
f620: 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61  the memory has a
f630: 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61  lready.** been a
f640: 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70 72  llocated by a pr
f650: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ior call to this
f660: 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73   routine, so jus
f670: 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a  t return a copy.
f680: 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c  ** of pBuf and l
f690: 65 61 76 65 20 52 65 75 73 61 62 6c 65 53 70 61  eave ReusableSpa
f6a0: 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ce unchanged..**
f6b0: 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74  .** This allocat
f6c0: 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74  or is employed t
f6d0: 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73  o repurpose unus
f6e0: 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20  ed slots at the 
f6f0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70  end of the.** op
f700: 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70 72  code array of pr
f710: 65 70 61 72 65 64 20 73 74 61 74 65 20 66 6f 72  epared state for
f720: 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65   other memory ne
f730: 65 64 73 20 6f 66 20 74 68 65 20 70 72 65 70 61  eds of the prepa
f740: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
f750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f760: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
f770: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
f780: 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c  pace *p,  /* Bul
f790: 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  k memory availab
f7a0: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
f7b0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
f7c0: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
f7d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
f7e0: 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f   prior allocatio
f7f0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  n */.  int nByte
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d   /* Bytes of mem
f820: 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b  ory needed */.){
f830: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
f840: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
f850: 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20  p->pSpace) );.  
f860: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
f870: 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44     nByte = ROUND
f880: 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  8(nByte);.    if
f890: 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46  ( nByte <= p->nF
f8a0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ree ){.      p->
f8b0: 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a  nFree -= nByte;.
f8c0: 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d        pBuf = &p-
f8d0: 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65  >pSpace[p->nFree
f8e0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
f8f0: 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b      p->nNeeded +
f900: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20  = nByte;.    }. 
f910: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
f920: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
f930: 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74  T(pBuf) );.  ret
f940: 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a  urn pBuf;.}../*.
f950: 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44  ** Rewind the VD
f960: 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  BE back to the b
f970: 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70  eginning in prep
f980: 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72  aration for.** r
f990: 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f  unning it..*/.vo
f9a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
f9b0: 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23  wind(Vdbe *p){.#
f9c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
f9d0: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
f9e0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
f9f0: 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69  ).  int i;.#endi
fa00: 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  f.  assert( p!=0
fa10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
fa20: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
fa30: 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61  IC_INIT || p->ma
fa40: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
fa50: 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  RESET );..  /* T
fa60: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
fa70: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
fa80: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
fa90: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
faa0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
fab0: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
fac0: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
fad0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
fae0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
faf0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
fb00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
fb10: 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  BUG.  for(i=0; i
fb20: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
fb30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
fb40: 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62  Mem[i].db==p->db
fb50: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
fb60: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
fb70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
fb80: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
fb90: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
fba0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
fbb0: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
fbc0: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
fbd0: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
fbe0: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
fbf0: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
fc00: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
fc10: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
fc20: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
fc30: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
fc40: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
fc50: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
fc60: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
fc70: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
fc80: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
fc90: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
fca0: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
fcb0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
fcc0: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
fcd0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
fce0: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
fcf0: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
fd00: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
fd10: 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  g registers and 
fd20: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
fd30: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
fd40: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
fd50: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
fd60: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
fd70: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
fd80: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
fd90: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
fda0: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
fdb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
fdc0: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79  e called exactly
fdd0: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69   once on each vi
fde0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
fdf0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
fe00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
fe10: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
fe20: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
fe30: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
fe40: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
fe50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
fe60: 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74   further calls t
fe70: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
fe80: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
fe90: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
fea0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
feb0: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
fec0: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
fed0: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
fee0: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
fef0: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
ff00: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
ff10: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
ff20: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
ff30: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
ff40: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
ff50: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
ff60: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
ff70: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
ff80: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
ff90: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
ffa0: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
ffb0: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
ffc0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
ffd0: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
ffe0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
fff0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
10020 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
10030 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
10040 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
10050 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
10060 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10080 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
10090 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
100a0 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
100b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
100c0 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
100d0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
100e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
100f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10100 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
10110 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
10120 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10140 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
10150 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
10160 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10180 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
10190 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
101a0 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  rams */.  int n;
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
101d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74   counter */.  st
101e0 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
101f0 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ce x;        /* 
10200 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65  Reusable bulk me
10210 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72  mory */..  asser
10220 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
10230 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
10240 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
10250 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
10260 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
10270 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
10280 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
10290 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20  =p->pParse );.  
102a0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
102b0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
102c0 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
102d0 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
102e0 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
102f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
10300 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
10310 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
10320 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
10330 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73   .  /* Each curs
10340 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79  or uses a memory
10350 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73   cell.  The firs
10360 74 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72  t cursor (cursor
10370 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65   0) can.  ** use
10380 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69   aMem[0] which i
10390 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
103a0 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
103b0 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63   program.  Alloc
103c0 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61  ate.  ** space a
103d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65  t the end of aMe
103e0 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20  m[] for cursors 
103f0 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20  1 and greater.. 
10400 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c   ** See also: al
10410 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a  locateCursor()..
10420 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e    */.  nMem += n
10430 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43  Cursor;.  if( nC
10440 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d  ursor==0 && nMem
10450 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a  >0 ) nMem++;  /*
10460 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b   Space for aMem[
10470 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75  0] even if not u
10480 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  sed */..  /* Fig
10490 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
104a0 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79   reusable memory
104b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74   is available at
104c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
104d0 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61    ** opcode arra
104e0 79 2e 20 20 54 68 69 73 20 65 78 74 72 61 20 6d  y.  This extra m
104f0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65  emory will be re
10500 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74  allocated for ot
10510 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a  her elements.  *
10520 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65  * of the prepare
10530 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
10540 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73  /.  n = ROUND8(s
10550 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70  izeof(Op)*p->nOp
10560 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
10570 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f  /* Bytes of opco
10580 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a  de memory used *
10590 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26  /.  x.pSpace = &
105a0 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d  ((u8*)p->aOp)[n]
105b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
105c0 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65  /* Unused opcode
105d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73   memory */.  ass
105e0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
105f0 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61  ALIGNMENT(x.pSpa
10600 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65  ce) );.  x.nFree
10610 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50   = ROUNDDOWN8(pP
10620 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20  arse->szOpAlloc 
10630 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20  - n);  /* Bytes 
10640 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79  of unused memory
10650 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e   */.  assert( x.
10660 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73  nFree>=0 );.  as
10670 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
10680 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53  _ALIGNMENT(&x.pS
10690 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29  pace[x.nFree]) )
106a0 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
106b0 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
106c0 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
106d0 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
106e0 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
106f0 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
10700 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
10710 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
10720 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
10730 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
10740 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
10750 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72  .  /* Memory for
10760 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
10770 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
10780 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
10790 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  d in one or two.
107a0 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
107b0 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
107c0 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
107d0 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61   unused memory a
107e0 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
107f0 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
10800 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
10810 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
10820 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
10830 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
10840 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
10850 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
10860 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
10870 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
10880 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61  fill in the rema
10890 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66 72  inder using a fr
108a0 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  esh memory alloc
108b0 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  ation.  .  **.  
108c0 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73  ** This two-pass
108d0 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72   approach that r
108e0 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65  euses as much me
108f0 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
10900 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c   from.  ** the l
10910 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61  eftover memory a
10920 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10930 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
10940 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69  This can signifi
10950 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75  cantly.  ** redu
10960 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ce the amount of
10970 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
10980 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
10990 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 78 2e 6e  ment..  */.  x.n
109a0 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 70 2d  Needed = 0;.  p-
109b0 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
109c0 63 65 28 26 78 2c 20 30 2c 20 6e 4d 65 6d 2a 73  ce(&x, 0, nMem*s
109d0 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70  izeof(Mem));.  p
109e0 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  ->aVar = allocSp
109f0 61 63 65 28 26 78 2c 20 30 2c 20 6e 56 61 72 2a  ace(&x, 0, nVar*
10a00 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
10a10 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
10a20 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 41 72  Space(&x, 0, nAr
10a30 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b  g*sizeof(Mem*));
10a40 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c  .  p->apCsr = al
10a50 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
10a60 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
10a70 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
10a80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10a90 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
10aa0 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d  US.  p->anExec =
10ab0 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10ac0 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  0, p->nOp*sizeof
10ad0 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (i64));.#endif. 
10ae0 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 20 29   if( x.nNeeded )
10af0 7b 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d  {.    x.pSpace =
10b00 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69   p->pFree = sqli
10b10 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
10b20 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b  (db, x.nNeeded);
10b30 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78  .    x.nFree = x
10b40 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 20 20 69 66  .nNeeded;.    if
10b50 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
10b60 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  led ){.      p->
10b70 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
10b80 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e  e(&x, p->aMem, n
10b90 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Mem*sizeof(Mem))
10ba0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20  ;.      p->aVar 
10bb0 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
10bc0 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73   p->aVar, nVar*s
10bd0 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20  izeof(Mem));.   
10be0 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c     p->apArg = al
10bf0 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
10c00 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
10c10 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 20  of(Mem*));.     
10c20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
10c30 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
10c40 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
10c50 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
10c60 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
10c70 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
10c80 4e 53 54 41 54 55 53 0a 20 20 20 20 20 20 70 2d  NSTATUS.      p-
10c90 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53  >anExec = allocS
10ca0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78  pace(&x, p->anEx
10cb0 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
10cc0 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a  f(i64));.#endif.
10cd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
10ce0 70 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d  pVList = pParse-
10cf0 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73  >pVList;.  pPars
10d00 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a  e->pVList =  0;.
10d10 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70    p->explain = p
10d20 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a  Parse->explain;.
10d30 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
10d40 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
10d50 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70  >nVar = 0;.    p
10d60 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->nCursor = 0;. 
10d70 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a     p->nMem = 0;.
10d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
10d90 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
10da0 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  r;.    p->nVar =
10db0 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
10dc0 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70    initMemArray(p
10dd0 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62  ->aVar, nVar, db
10de0 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
10df0 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
10e00 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
10e10 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c  y(p->aMem, nMem,
10e20 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e   db, MEM_Undefin
10e30 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ed);.    memset(
10e40 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75  p->apCsr, 0, nCu
10e50 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
10e60 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65  Cursor*));.#ifde
10e70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10e80 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
10e90 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e      memset(p->an
10ea0 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a  Exec, 0, p->nOp*
10eb0 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
10ec0 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
10ed0 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
10ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10ef0 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
10f00 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
10f10 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
10f20 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
10f30 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
10f40 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
10f50 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
10f60 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
10f70 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
10f80 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10f90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10fa0 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20  pCx->pBtx==0 || 
10fb0 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  pCx->eCurType==C
10fc0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
10fd0 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65    switch( pCx->e
10fe0 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63  CurType ){.    c
10ff0 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54  ase CURTYPE_SORT
11000 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
11010 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
11020 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
11030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11040 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52 54   }.    case CURT
11050 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20  YPE_BTREE: {.   
11060 20 20 20 69 66 28 20 70 43 78 2d 3e 69 73 45 70     if( pCx->isEp
11070 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 20  hemeral ){.     
11080 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78     if( pCx->pBtx
11090 20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   ) sqlite3BtreeC
110a0 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 78 29 3b  lose(pCx->pBtx);
110b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
110c0 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
110d0 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
110e0 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
110f0 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20  exists, by.     
11100 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
11110 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  bove. */.      }
11120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
11130 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43  sert( pCx->uc.pC
11140 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
11150 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11160 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
11170 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
11180 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11190 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
111a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
111b0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
111c0 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a  se CURTYPE_VTAB:
111d0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
111e0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
111f0 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56  Cur = pCx->uc.pV
11200 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Cur;.      const
11210 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
11220 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72  *pModule = pVCur
11230 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
11240 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11250 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
11260 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56  ef>0 );.      pV
11270 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
11280 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c  --;.      pModul
11290 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29  e->xClose(pVCur)
112a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
112b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
112c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
112d0 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ll cursors in th
112e0 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e  e current frame.
112f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11300 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
11310 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ame(Vdbe *p){.  
11320 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
11330 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
11340 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
11350 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
11360 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
11370 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
11380 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
11390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
113a0 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
113b0 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
113c0 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
113d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
113e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
113f0 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
11400 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
11410 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
11420 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
11430 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
11440 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
11450 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
11460 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
11470 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
11480 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
11490 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
114a0 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
114b0 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
114c0 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
114d0 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
114e0 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
114f0 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65  nFrame(v);.#ifde
11500 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11510 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
11520 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46    v->anExec = pF
11530 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65  rame->anExec;.#e
11540 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  ndif.  v->aOp = 
11550 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
11560 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
11570 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
11580 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
11590 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
115a0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
115b0 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
115c0 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
115d0 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
115e0 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
115f0 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
11600 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
11610 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
11620 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76  me->nChange;.  v
11630 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  ->db->nChange = 
11640 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67  pFrame->nDbChang
11650 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  e;.  sqlite3Vdbe
11660 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d  DeleteAuxData(v-
11670 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74  >db, &v->pAuxDat
11680 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e  a, -1, 0);.  v->
11690 70 41 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d  pAuxData = pFram
116a0 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70  e->pAuxData;.  p
116b0 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20  Frame->pAuxData 
116c0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  = 0;.  return pF
116d0 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
116e0 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
116f0 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
11700 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
11710 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
11720 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
11730 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
11740 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
11750 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
11760 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
11770 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
11780 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
11790 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
117a0 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
117b0 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
117c0 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
117d0 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
117e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
117f0 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
11800 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
11810 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
11820 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
11830 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
11840 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
11850 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
11860 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
11870 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
11880 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
11890 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
118a0 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30     p->pFrame = 0
118b0 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20  ;.    p->nFrame 
118c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
118d0 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20  t( p->nFrame==0 
118e0 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  );.  closeCursor
118f0 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69  sInFrame(p);.  i
11900 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
11910 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
11920 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d  y(p->aMem, p->nM
11930 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
11940 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
11950 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
11960 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
11970 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
11980 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
11990 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
119a0 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
119b0 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  te(pDel);.  }.. 
119c0 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61   /* Delete any a
119d0 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f  uxdata allocatio
119e0 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56  ns made by the V
119f0 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41  M */.  if( p->pA
11a00 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33  uxData ) sqlite3
11a10 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
11a20 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75  a(p->db, &p->pAu
11a30 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
11a40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78   assert( p->pAux
11a50 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Data==0 );.}../*
11a60 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
11a70 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
11a80 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
11a90 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
11aa0 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
11ab0 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
11ac0 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
11ad0 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
11ae0 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
11af0 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
11b00 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
11b10 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
11b20 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
11b30 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
11b40 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
11b50 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
11b60 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
11b70 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
11b80 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
11b90 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69  nResColumn){.  i
11ba0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
11bb0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
11bc0 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  if( p->nResColum
11bd0 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  n ){.    release
11be0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
11bf0 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
11c00 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
11c10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11c20 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
11c30 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52  e);.  }.  n = nR
11c40 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
11c50 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
11c60 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
11c70 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
11c80 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
11c90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
11ca0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  N(db, sizeof(Mem
11cb0 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
11cc0 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
11cd0 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41  turn;.  initMemA
11ce0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
11cf0 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  , n, db, MEM_Nul
11d00 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  l);.}../*.** Set
11d10 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11d20 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
11d30 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
11d40 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
11d50 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
11d60 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
11d70 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
11d80 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
11d90 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
11da0 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
11db0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
11dc0 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
11dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
11de0 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
11df0 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
11e00 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
11e10 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
11e20 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
11e30 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
11e40 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
11e50 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
11e60 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
11e70 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
11e80 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
11e90 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
11ea0 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
11eb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11ec0 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
11ed0 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
11f00 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
11f10 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
11f40 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
11f50 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
11f60 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f80 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
11f90 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
11fa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11fb0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
11fc0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
11fd0 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
11fe0 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
11ff0 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
12000 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
12010 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
12020 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
12030 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
12040 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
12050 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
12060 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
12070 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
12080 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
12090 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
120a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
120b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
120c0 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
120d0 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
120e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
120f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
12100 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
12110 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
12120 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
12130 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
12140 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
12150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
12160 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
12170 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
12180 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
12190 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
121a0 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
121b0 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
121c0 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
121d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
121e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
121f0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
12200 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
12210 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
12220 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
12230 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
12240 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
12250 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
12260 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
12270 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12280 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
12290 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
122a0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
122b0 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
122c0 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
122d0 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
122e0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
122f0 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
12300 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
12310 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
12320 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
12330 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
12340 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
12350 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
12360 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  saction.        
12370 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
12380 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65  at are candidate
12390 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73  s for a two-phas
123a0 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61  e commit using a
123b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
123c0 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
123d0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72  urnal */.  int r
123e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
123f0 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
12400 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
12410 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12420 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
12430 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
12440 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
12450 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
12460 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
12470 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
12480 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
12490 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
124a0 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
124b0 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
124c0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
124d0 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
124e0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
124f0 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
12500 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
12510 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
12520 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
12530 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
12540 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
12550 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
12560 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12570 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
12580 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
12590 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
125a0 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
125b0 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
125c0 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
125d0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
125e0 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
125f0 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
12600 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
12610 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
12620 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
12630 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
12640 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
12650 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
12660 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
12670 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
12680 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
12690 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
126a0 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
126b0 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
126c0 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
126d0 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
126e0 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
126f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
12700 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
12710 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
12720 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
12730 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
12740 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
12750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12760 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
12770 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
12780 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12790 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
127a0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
127b0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
127c0 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e   /* Whether or n
127d0 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69  ot a database mi
127e0 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65  ght need a maste
127f0 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64  r journal depend
12800 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  s upon.      ** 
12810 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  its journal mode
12820 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68   (among other th
12830 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74  ings).  This mat
12840 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77  rix determines w
12850 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  hich.      ** jo
12860 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20  urnal modes use 
12870 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
12880 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f   and which do no
12890 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  t */.      stati
128a0 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65  c const u8 aMJNe
128b0 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  eded[] = {.     
128c0 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a     /* DELETE   *
128d0 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  /  1,.        /*
128e0 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c   PERSIST   */ 1,
128f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20  .        /* OFF 
12900 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
12910 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20      /* TRUNCATE 
12920 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
12930 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30  * MEMORY    */ 0
12940 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c  ,.        /* WAL
12950 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20         */ 0.    
12960 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72    };.      Pager
12970 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50   *pPager;   /* P
12980 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
12990 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20  with pBt */.    
129a0 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
129b0 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
129c0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
129d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20  .      pPager = 
129e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
129f0 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  r(pBt);.      if
12a00 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66  ( db->aDb[i].saf
12a10 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52  ety_level!=PAGER
12a20 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
12a30 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65  .       && aMJNe
12a40 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65  eded[sqlite3Page
12a50 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
12a60 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 20  pPager)].       
12a70 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  && sqlite3PagerI
12a80 73 4d 65 6d 64 62 28 70 50 61 67 65 72 29 3d 3d  sMemdb(pPager)==
12a90 30 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20  0.      ){ .    
12aa0 20 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31      assert( i!=1
12ab0 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61   );.        nTra
12ac0 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns++;.      }.  
12ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12ae0 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
12af0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12b00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12b10 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
12b20 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
12b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12b40 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
12b50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
12b60 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
12b70 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
12b80 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
12b90 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
12ba0 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
12bb0 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
12bc0 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
12bd0 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
12be0 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
12bf0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
12c00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
12c10 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12c20 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
12c30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
12c40 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
12c50 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
12c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
12c70 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
12c80 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
12c90 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
12ca0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
12cb0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
12cc0 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
12cd0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
12ce0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
12cf0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
12d00 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
12d10 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
12d20 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
12d30 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
12d40 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
12d50 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
12d60 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
12d70 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
12d80 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
12d90 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
12da0 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
12db0 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
12dc0 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
12dd0 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
12de0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
12df0 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
12e00 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
12e10 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
12e20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
12e30 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
12e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12e50 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
12e60 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
12e70 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
12e80 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
12e90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
12ea0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
12eb0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
12ec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12ed0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
12ee0 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
12ef0 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
12f00 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
12f10 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
12f20 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
12f30 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
12f40 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
12f50 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
12f60 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
12f70 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
12f80 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
12f90 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
12fa0 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
12fb0 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
12fc0 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
12fd0 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
12fe0 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
12ff0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
13000 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
13010 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
13020 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
13030 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13040 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
13050 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
13060 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
13070 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13080 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
13090 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
130a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
130b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
130c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
130d0 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
130e0 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
130f0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
13100 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
13110 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
13120 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
13130 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
13140 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
13150 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13160 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
13170 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
13180 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
13190 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
131a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
131b0 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
131c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
131d0 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
131e0 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  s;.    char *zMa
131f0 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
13200 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
13210 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13220 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
13230 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
13240 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
13250 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
13260 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
13270 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
13280 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
13290 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
132a0 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
132b0 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a  retryCount = 0;.
132c0 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c      int nMainFil
132d0 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  e;..    /* Selec
132e0 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
132f0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
13300 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20      nMainFile = 
13310 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13320 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
13330 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
13340 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
13350 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20  -mjXXXXXX9XXz", 
13360 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
13370 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29  if( zMaster==0 )
13380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13390 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64  OMEM_BKPT;.    d
133a0 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
133b0 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
133c0 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
133d0 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
133e0 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
133f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
13400 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
13410 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
13420 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
13430 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
13440 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
13450 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
13460 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13470 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
13480 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
13490 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
134a0 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
134b0 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
134c0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
134d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
134e0 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
134f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
13500 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
13510 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
13520 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
13530 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
13540 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
13550 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
13560 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
13590 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
135a0 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
135b0 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
135c0 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
135d0 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
135e0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
135f0 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
13600 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
13610 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
13620 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
13630 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
13640 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
13650 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
13660 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
13670 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
13680 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
13690 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
136a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
136b0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
136c0 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
136d0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
136e0 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
136f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
13700 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
13710 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13720 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
13730 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
13740 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
13750 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13760 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
13770 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
13780 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
13790 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
137a0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
137b0 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
137c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
137d0 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
137e0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
137f0 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
13800 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
13810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13820 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13830 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
13840 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13850 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
13860 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
13870 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
13880 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
13890 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
138a0 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
138b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
138c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
138d0 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
138e0 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
138f0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
13900 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
13910 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
13920 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
13930 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
13940 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
13950 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13960 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
13970 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
13980 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
13990 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
139a0 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
139b0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
139c0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
139d0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
139e0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
139f0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
13a00 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
13a10 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
13a20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
13a30 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
13a40 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
13a50 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
13a60 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
13a70 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
13a80 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
13a90 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
13aa0 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
13ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13ac0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
13ad0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
13ae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
13af0 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
13b00 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
13b10 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
13b20 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
13b30 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
13b40 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
13b50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13b60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13b70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13b80 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
13b90 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
13ba0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13bb0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
13bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13bd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
13be0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
13bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13c10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
13c20 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
13c30 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
13c40 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
13c50 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
13c60 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
13c70 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
13c80 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
13c90 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  f( 0==(sqlite3Os
13ca0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
13cb0 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
13cc0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
13cd0 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
13ce0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
13cf0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
13d00 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
13d10 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
13d20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13d30 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
13d40 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
13d50 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
13d60 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
13d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
13d80 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
13d90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
13da0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
13db0 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
13dc0 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
13dd0 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
13de0 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
13df0 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
13e00 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13e10 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
13e20 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
13e30 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
13e40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
13e50 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
13e60 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
13e70 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
13e80 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
13e90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13ea0 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
13eb0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
13ec0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13ed0 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
13ee0 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
13ef0 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
13f00 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
13f10 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
13f20 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
13f30 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
13f40 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
13f50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13f60 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
13f70 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
13f80 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
13f90 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
13fa0 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
13fb0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
13fc0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
13fd0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
13fe0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
13ff0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
14000 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
14010 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
14020 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14030 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
14040 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
14050 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
14060 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
14070 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
14080 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
14090 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
140a0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
140b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
140c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
140d0 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
140e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
140f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
14100 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
14110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
14120 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
14130 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
14140 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
14150 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
14160 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
14170 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
14180 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
14190 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
141a0 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
141b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
141c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
141d0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
141e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
141f0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
14200 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
14210 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
14220 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
14240 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
14250 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
14260 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
14270 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
14280 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
14290 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
142a0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
142b0 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
142c0 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
142d0 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
142e0 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
142f0 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
14300 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
14310 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
14320 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
14330 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
14340 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
14350 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
14360 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
14370 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
14380 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
14390 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
143a0 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
143b0 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
143c0 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
143d0 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
143e0 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
143f0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
14400 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
14410 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
14420 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
14430 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
14440 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
14450 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
14460 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
14470 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
14480 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14490 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
144a0 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
144b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
144c0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
144d0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
144e0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
144f0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
14500 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
14510 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
14520 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
14530 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
14540 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
14550 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
14560 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
14570 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
14580 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
14590 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
145a0 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
145b0 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
145c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
145d0 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
145e0 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
145f0 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
14600 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
14610 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
14620 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
14630 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
14640 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
14650 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
14660 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
14670 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
14680 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
14690 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
146a0 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
146b0 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
146c0 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
146d0 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
146e0 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
146f0 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
14700 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
14710 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
14720 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
14730 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
14740 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
14750 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
14760 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
14770 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
14780 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
14790 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
147a0 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
147b0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
147c0 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
147d0 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
147e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
147f0 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
14800 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
14810 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
14820 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
14830 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
14840 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
14850 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
14860 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
14870 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
14880 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
14890 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
148a0 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
148b0 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
148c0 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
148d0 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
148e0 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
148f0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
14900 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
14910 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
14920 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
14930 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
14940 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
14950 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
14960 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
14970 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
14980 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
14990 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
149a0 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
149b0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
149c0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
149d0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
149e0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
149f0 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
14a00 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
14a10 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62  NOINLINE int vdb
14a20 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14a30 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
14a40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
14a50 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
14a60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14a70 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
14a80 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
14a90 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
14aa0 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65  ement-1;..  asse
14ab0 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
14ac0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
14ad0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
14ae0 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74  LEASE);.  assert
14af0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
14b00 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
14b10 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
14b20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
14b30 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
14b40 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
14b50 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
14b60 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
14b70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72  LITE_OK;.    Btr
14b80 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
14b90 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
14ba0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69  ( pBt ){.      i
14bb0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
14bc0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
14bd0 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
14be0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
14bf0 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
14c00 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
14c10 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
14c20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
14c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14c40 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14c50 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
14c60 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
14c70 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
14c80 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
14c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14cb0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
14cc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  }.    }.  }.  db
14cd0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
14ce0 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
14cf0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  = 0;..  if( rc==
14d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d10 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
14d20 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
14d30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14d40 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
14d50 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
14d60 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
14d70 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
14d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14d90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
14da0 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
14db0 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
14dc0 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
14dd0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
14de0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  }..  /* If the s
14df0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
14e00 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
14e10 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
14e20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a  restore the .  *
14e30 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
14e40 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
14e50 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
14e60 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
14e70 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68  ad when .  ** th
14e80 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
14e90 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
14ea0 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f  ed.  */.  if( eO
14eb0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
14ec0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d  LBACK ){.    db-
14ed0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
14ee0 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
14ef0 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  ;.    db->nDefer
14f00 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
14f10 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
14f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14f30 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
14f40 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
14f50 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
14f60 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  Op){.  if( p->db
14f70 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
14f80 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
14f90 0a 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65  .    return vdbe
14fa0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
14fb0 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  , eOp);.  }.  re
14fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
14fe0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14ff0 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
15000 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
15010 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
15020 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
15030 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
15040 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
15050 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
15060 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
15070 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
15080 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
15090 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
150a0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
150b0 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
150c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
150d0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
150e0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
150f0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
15100 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
15110 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
15120 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
15130 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
15140 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
15150 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
15160 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
15170 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
15180 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
15190 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
151a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
151b0 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
151c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
151d0 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
151e0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
151f0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
15200 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
15210 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
15220 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
15230 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
15240 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
15250 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
15260 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
15270 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
15280 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
15290 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
152a0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
152b0 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
152c0 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
152d0 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
152e0 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46  3VdbeError(p, "F
152f0 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
15300 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
15310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15320 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
15330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15340 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15360 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
15370 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
15380 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
15390 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
153a0 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
153b0 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
153c0 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
153d0 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
153e0 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
153f0 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
15400 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
15410 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15420 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
15430 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
15440 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
15450 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
15460 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
15470 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
15480 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
15490 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
154a0 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
154b0 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
154c0 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
154d0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
154e0 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
154f0 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
15500 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
15510 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
15520 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
15530 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
15540 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
15550 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
15560 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
15570 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
15580 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
15590 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
155a0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
155b0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
155c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
155e0 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
155f0 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
15600 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
15610 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
15620 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
15630 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
15640 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
15650 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
15660 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
15670 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
15680 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
15690 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
156a0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
156b0 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
156c0 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
156d0 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
156e0 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
156f0 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
15700 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
15710 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
15720 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
15730 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
15740 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
15750 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
15760 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
15770 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
15780 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
15790 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
157a0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
157b0 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
157c0 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
157d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
157e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
157f0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
15800 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
15810 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
15820 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
15830 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
15840 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
15850 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
15860 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
15870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15880 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
15890 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
158a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
158b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
158c0 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
158d0 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b  sors(p);.  check
158e0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
158f0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
15900 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
15910 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
15920 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
15930 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
15940 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
15950 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
15960 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
15970 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
15980 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
15990 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
159a0 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
159b0 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
159c0 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
159d0 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
159e0 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
159f0 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
15a00 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
15a10 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
15a20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
15a30 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
15a40 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
15a50 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
15a60 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
15a70 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
15a80 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
15a90 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
15aa0 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
15ab0 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
15ac0 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
15ad0 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
15ae0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
15af0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
15b00 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
15b10 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
15b20 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
15b30 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
15b40 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
15b50 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
15b60 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
15b70 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
15b80 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
15b90 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
15ba0 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
15bb0 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
15bc0 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
15bd0 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
15be0 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
15bf0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
15c00 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
15c10 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
15c20 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
15c30 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
15c40 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
15c50 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
15c60 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
15c70 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
15c80 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
15c90 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
15ca0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
15cb0 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
15cc0 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
15cd0 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
15ce0 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
15cf0 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
15d00 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
15d10 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
15d20 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
15d30 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
15d40 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
15d50 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
15d60 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
15d70 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
15d80 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
15d90 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
15da0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
15db0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
15dc0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
15dd0 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
15de0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
15df0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
15e00 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
15e10 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
15e20 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
15e30 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
15e40 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
15e50 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
15e60 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
15e70 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
15e80 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
15e90 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
15ea0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15eb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
15ec0 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
15ed0 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
15ee0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
15ef0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
15f00 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
15f10 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
15f20 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
15f30 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
15f40 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
15f50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15f60 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
15f70 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
15f80 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
15f90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15fa0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15fb0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15fc0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
15fd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
15fe0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
15ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16000 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
16010 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
16020 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
16030 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
16040 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
16050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16060 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
16070 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
16080 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
16090 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
160a0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
160b0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
160c0 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
160d0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
160e0 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
160f0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
16100 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
16110 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
16120 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
16130 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
16140 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
16150 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
16160 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
16170 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
16180 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
16190 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
161a0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
161b0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
161c0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
161d0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
161e0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
161f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
16200 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16210 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
16220 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
16230 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
16240 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
16250 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
16260 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
16270 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16290 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
162a0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
162b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
162c0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
162d0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
162e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
162f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16300 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16310 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
16320 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
16330 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
16340 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
16350 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
16360 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
16370 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
16380 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
16390 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
163a0 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
163b0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
163c0 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
163d0 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
163e0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
163f0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
16400 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
16410 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
16420 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
16430 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
16440 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
16450 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
16460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16480 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
16490 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
164a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
164b0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
164c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
164d0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
164e0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
164f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16500 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
16510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16520 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16530 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
16540 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
16550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
16560 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
16570 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
16580 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
16590 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
165a0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
165b0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
165c0 7e 28 75 36 34 29 53 51 4c 49 54 45 5f 44 65 66  ~(u64)SQLITE_Def
165d0 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
165e0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
165f0 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
16600 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16620 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
16630 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
16640 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OK);.        p->
16650 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
16660 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
16670 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
16680 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
16690 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
166a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
166b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
166c0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
166d0 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
166e0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
166f0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
16700 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
16710 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
16720 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
16730 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
16740 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
16750 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
16760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
16770 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
16780 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
16790 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
167a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
167b0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
167c0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
167d0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
167e0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
167f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16800 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
16810 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
16820 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
16830 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
16840 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
16850 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
16860 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
16870 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
16880 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
16890 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
168a0 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
168b0 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
168c0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
168d0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
168e0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
168f0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
16900 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
16910 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
16920 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
16930 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
16940 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
16950 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
16960 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
16970 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16980 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
16990 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
169a0 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
169b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
169c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
169d0 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
169e0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
169f0 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
16a00 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
16a10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16a20 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
16a30 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
16a40 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
16a50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16a60 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
16a70 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
16a80 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
16a90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16aa0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
16ab0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
16ac0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
16ad0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
16ae0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16af0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
16b00 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
16b10 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
16b20 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
16b30 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
16b40 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
16b50 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
16b60 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
16b70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16b80 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
16b90 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
16ba0 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
16bb0 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
16bc0 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
16bd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
16be0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16bf0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
16c00 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
16c10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16c30 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
16c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
16c50 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
16c60 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
16c70 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
16c80 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
16c90 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
16ca0 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
16cb0 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
16cc0 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
16cd0 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
16ce0 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
16cf0 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
16d00 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63  .    db->nVdbeAc
16d10 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tive--;.    if( 
16d20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64  !p->readOnly ) d
16d30 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b  b->nVdbeWrite--;
16d40 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52  .    if( p->bIsR
16d50 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62  eader ) db->nVdb
16d60 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73  eRead--;.    ass
16d70 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
16d80 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52  tive>=db->nVdbeR
16d90 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ead );.    asser
16da0 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  t( db->nVdbeRead
16db0 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  >=db->nVdbeWrite
16dc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16dd0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d  db->nVdbeWrite>=
16de0 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  0 );.  }.  p->ma
16df0 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
16e00 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
16e10 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
16e20 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
16e30 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
16e40 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
16e50 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
16e60 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
16e70 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
16e80 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
16e90 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
16ea0 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
16eb0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
16ec0 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
16ed0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
16ee0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
16ef0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
16f00 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
16f10 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
16f20 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
16f30 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
16f40 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
16f50 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
16f60 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
16f70 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
16f80 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
16f90 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
16fa0 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
16fb0 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
16fc0 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
16fd0 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
16fe0 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
16ff0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
17000 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
17010 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
17020 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
17030 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
17040 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
17050 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
17060 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
17070 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
17080 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17090 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
170a0 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
170b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
170c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
170d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
170e0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
170f0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
17100 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
17110 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
17120 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
17130 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
17140 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
17150 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
17160 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
17170 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
17180 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
17190 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
171a0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
171b0 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
171c0 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
171d0 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
171e0 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
171f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
17200 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
17210 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
17220 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
17230 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17240 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
17250 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
17260 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
17270 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c   db->bBenignMall
17280 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc++;.    sqlite
17290 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
172a0 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62  oc();.    if( db
172b0 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e  ->pErr==0 ) db->
172c0 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61  pErr = sqlite3Va
172d0 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
172e0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
172f0 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
17300 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
17310 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
17320 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
17330 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
17340 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64  nMalloc();.    d
17350 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  b->bBenignMalloc
17360 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  --;.  }else if( 
17370 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20  db->pErr ){.    
17380 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 4e  sqlite3ValueSetN
17390 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ull(db->pErr);. 
173a0 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64 65   }.  db->errCode
173b0 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
173c0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
173d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
173e0 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53  OG./*.** If an S
173f0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
17400 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69  LOG hook is regi
17410 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56  stered and the V
17420 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20  M has been run, 
17430 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a  .** invoke it..*
17440 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
17450 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56  beInvokeSqllog(V
17460 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73  dbe *v){.  if( s
17470 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17480 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d  ig.xSqllog && v-
17490 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
174a0 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e  & v->zSql && v->
174b0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  pc>=0 ){.    cha
174c0 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73  r *zExpanded = s
174d0 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
174e0 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b  Sql(v, v->zSql);
174f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e  .    assert( v->
17500 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
17510 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70   );.    if( zExp
17520 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73  anded ){.      s
17530 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17540 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20  ig.xSqllog(.    
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
17560 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
17570 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78  gArg, v->db, zEx
17580 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20  panded, 1.      
17590 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
175a0 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45  DbFree(v->db, zE
175b0 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a  xpanded);.    }.
175c0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
175d0 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53  fine vdbeInvokeS
175e0 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a  qllog(x).#endif.
175f0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
17600 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
17610 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
17620 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
17630 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
17640 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
17650 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
17660 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
17670 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
17680 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
17690 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
176a0 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
176b0 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
176c0 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
176d0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
176e0 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
176f0 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
17700 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
17710 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
17720 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
17730 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
17740 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
17750 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
17760 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
17770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17780 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
17790 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
177a0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
177b0 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
177c0 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
177d0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 20  ndif..  sqlite3 
177e0 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
177f0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
17800 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
17810 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
17820 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
17830 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
17840 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
17850 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
17860 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
17870 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
17880 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
17890 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
178a0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
178b0 20 68 61 73 20 62 65 65 6e 20 72 75 6e 20 65 76   has been run ev
178c0 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
178d0 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
178e0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
178f0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
17900 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
17910 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
17920 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
17930 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
17940 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
17950 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
17960 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
17970 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
17980 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
17990 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
179a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
179b0 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
179c0 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
179d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
179e0 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e  =0 ){.    vdbeIn
179f0 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20  vokeSqllog(p);. 
17a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
17a10 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a  ansferError(p);.
17a20 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
17a30 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
17a40 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
17a50 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
17a60 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
17a70 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
17a80 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
17a90 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
17aa0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
17ab0 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
17ac0 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
17ad0 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
17ae0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
17af0 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
17b00 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
17b10 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
17b20 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
17b30 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
17b40 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
17b50 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
17b60 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
17b70 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  p->zErrMsg);.  }
17b80 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 72 65 67  ..  /* Reset reg
17b90 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61  ister contents a
17ba0 6e 64 20 72 65 63 6c 61 69 6d 20 65 72 72 6f 72  nd reclaim error
17bb0 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 2e   message memory.
17bc0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
17bd0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
17be0 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
17bf0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
17c00 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
17c10 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
17c20 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
17c30 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
17c40 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
17c50 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20  d up.  */.  if( 
17c60 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69  p->apCsr ) for(i
17c70 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
17c80 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
17c90 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
17ca0 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
17cb0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
17cc0 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  <p->nMem; i++) a
17cd0 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
17ce0 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64  ].flags==MEM_Und
17cf0 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  efined );.  }.#e
17d00 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
17d10 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
17d20 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
17d30 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65  sg = 0;.  p->pRe
17d40 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 23 69 66  sultSet = 0;.#if
17d50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17d60 0a 20 20 70 2d 3e 6e 57 72 69 74 65 20 3d 20 30  .  p->nWrite = 0
17d70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
17d80 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
17d90 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
17da0 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
17db0 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
17dc0 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
17dd0 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
17de0 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
17df0 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
17e00 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
17e10 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
17e20 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
17e30 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
17e40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
17e50 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
17e60 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
17e70 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
17e80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17e90 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66   "\n");.      if
17ea0 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
17eb0 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20       char c, pc 
17ec0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72  = 0;.        fpr
17ed0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
17ee0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
17ef0 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b  0; (c = p->zSql[
17f00 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
17f10 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
17f20 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
17f30 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
17f40 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75        putc(c, ou
17f50 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  t);.          pc
17f60 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
17f70 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d          if( pc!=
17f80 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
17f90 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
17fa0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
17fb0 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
17fc0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
17fd0 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  Hdr[100];.      
17fe0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
17ff0 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c  tf(sizeof(zHdr),
18000 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c   zHdr, "%6u %12l
18010 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20  lu %8llu ",.    
18020 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
18030 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
18040 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
18050 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
18060 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
18070 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
18080 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
18090 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
180a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
180b0 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a  t, "%s", zHdr);.
180c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
180d0 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
180e0 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
180f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
18100 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
18110 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
18120 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
18130 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74  GIC_RESET;.  ret
18140 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
18150 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
18160 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
18170 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
18180 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
18190 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
181a0 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
181b0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
181c0 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
181d0 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
181e0 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
181f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
18200 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
18210 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18220 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
18230 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
18240 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
18250 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
18260 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
18270 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
18280 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
18290 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
182a0 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
182b0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
182c0 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
182d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
182e0 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70  If parameter iOp
182f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
18300 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ro, then invoke 
18310 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
18320 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69  or.** all auxili
18330 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
18340 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  s currently cach
18350 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
18360 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69  sed as.** the fi
18370 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
18380 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69  .** Or, if iOp i
18390 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
183a0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
183b0 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75   then the destru
183c0 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  ctor is.** only 
183d0 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73  invoked for thos
183e0 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
183f0 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65   pointers create
18400 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a  d by the user .*
18410 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  * function invok
18420 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e  ed by the OP_Fun
18430 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20  ction opcode at 
18440 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20  instruction iOp 
18450 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c  of .** VM pVdbe,
18460 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69   and only then i
18470 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  f:.**.**    * th
18480 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e  e associated fun
18490 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
184a0 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c  is the 32nd or l
184b0 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a  ater (counting.*
184c0 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74  *      from left
184d0 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a   to right), or.*
184e0 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f  *.**    * the co
184f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
18500 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b  in argument mask
18510 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65   is clear (where
18520 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20   the first.**   
18530 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61     function para
18540 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  meter correspond
18550 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29  s to bit 0 etc.)
18560 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18570 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
18580 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ta(sqlite3 *db, 
18590 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e  AuxData **pp, in
185a0 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29  t iOp, int mask)
185b0 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29  {.  while( *pp )
185c0 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70  {.    AuxData *p
185d0 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69  Aux = *pp;.    i
185e0 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20  f( (iOp<0).     
185f0 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70  || (pAux->iAuxOp
18600 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20 20 20 20  ==iOp.          
18610 26 26 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67  && pAux->iAuxArg
18620 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  >=0.          &&
18630 20 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e   (pAux->iAuxArg>
18640 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d  31 || !(mask & M
18650 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69  ASKBIT32(pAux->i
18660 41 75 78 41 72 67 29 29 29 29 0a 20 20 20 20 29  AuxArg)))).    )
18670 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
18680 28 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3d  ( pAux->iAuxArg=
18690 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =31 );.      if(
186a0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75   pAux->xDeleteAu
186b0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  x ){.        pAu
186c0 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 28 70 41  x->xDeleteAux(pA
186d0 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
186e0 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
186f0 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20  Aux->pNextAux;. 
18700 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
18710 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  ee(db, pAux);.  
18720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18730 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 41  p= &pAux->pNextA
18740 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ux;.    }.  }.}.
18750 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
18760 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
18770 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20  d with the Vdbe 
18780 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
18790 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
187a0 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a  * except for obj
187b0 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63  ect itself, whic
187c0 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a  h is preserved..
187d0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
187e0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
187f0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
18800 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
18810 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
18820 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
18830 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
18840 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
18850 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
18860 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
18870 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18880 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f   and frees the o
18890 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f  bject itself..*/
188a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
188b0 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c  eClearObject(sql
188c0 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
188d0 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
188e0 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
188f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
18900 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
18910 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
18920 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
18930 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
18940 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
18950 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
18960 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
18970 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
18980 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
18990 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
189a0 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
189b0 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
189c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
189d0 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
189e0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
189f0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
18a00 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
18a10 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
18a20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71  p->nVar);.    sq
18a30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18a40 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20  p->pVList);.    
18a50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18a60 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d  , p->pFree);.  }
18a70 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
18a80 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
18a90 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
18aa0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
18ab0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
18ac0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18ad0 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53  >zSql);.#ifdef S
18ae0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52  QLITE_ENABLE_NOR
18af0 4d 41 4c 49 5a 45 0a 20 20 73 71 6c 69 74 65 33  MALIZE.  sqlite3
18b00 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e  DbFree(db, p->zN
18b10 6f 72 6d 53 71 6c 29 3b 0a 20 20 7b 0a 20 20 20  ormSql);.  {.   
18b20 20 44 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 54   DblquoteStr *pT
18b30 68 69 73 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  his, *pNext;.   
18b40 20 66 6f 72 28 70 54 68 69 73 3d 70 2d 3e 70 44   for(pThis=p->pD
18b50 62 6c 53 74 72 3b 20 70 54 68 69 73 3b 20 70 54  blStr; pThis; pT
18b60 68 69 73 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  his=pNext){.    
18b70 20 20 70 4e 65 78 74 20 3d 20 70 54 68 69 73 2d    pNext = pThis-
18b80 3e 70 4e 65 78 74 53 74 72 3b 0a 20 20 20 20 20  >pNextStr;.     
18b90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18ba0 62 2c 20 70 54 68 69 73 29 3b 0a 20 20 20 20 7d  b, pThis);.    }
18bb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
18bc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18bd0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
18be0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
18bf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18c00 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
18c10 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
18c20 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
18c30 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
18c40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18c50 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29  ee(db, p->aScan)
18c60 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
18c70 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
18c80 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
18c90 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18ca0 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
18cb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18cc0 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
18cd0 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
18ce0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18cf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
18d00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
18d10 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
18d20 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
18d30 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
18d40 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
18d50 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
18d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18d70 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
18d80 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
18d90 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
18da0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
18db0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
18dc0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
18dd0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
18de0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
18df0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
18e00 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
18e10 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  eeNN(db, p);.}..
18e20 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
18e30 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
18e40 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
18e50 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
18e60 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
18e70 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
18e80 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
18e90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
18ea0 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
18eb0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
18ec0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
18ed0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
18ee0 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
18ef0 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
18f00 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
18f10 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
18f20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18f30 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
18f40 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
18f50 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
18f60 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
18f70 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
18f80 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
18f90 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
18fa0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
18fb0 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  REE );.  rc = sq
18fc0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
18fd0 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70  Unpacked(p->uc.p
18fe0 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
18ff0 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
19000 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
19010 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
19020 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
19030 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19040 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
19050 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
19060 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
19070 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
19080 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
19090 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
190a0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
190b0 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
190c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
190d0 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
190e0 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
190f0 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
19100 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
19110 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
19120 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
19130 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
19140 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
19150 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
19160 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
19170 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
19180 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
19190 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
191a0 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
191b0 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
191c0 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
191d0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
191e0 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
191f0 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
19200 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
19210 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
19220 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
19230 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
19240 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
19250 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
19260 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
19270 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
19280 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
19290 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
192a0 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43  assert( p->uc.pC
192b0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
192c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
192d0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
192e0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
192f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19300 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
19310 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ore(p->uc.pCurso
19320 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
19330 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
19340 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
19350 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
19360 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
19370 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
19380 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19390 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72  * Check to ensur
193a0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
193b0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73  r is valid.  Res
193c0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a  tore the cursor.
193d0 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20  ** if need be.  
193e0 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65  Return any I/O e
193f0 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65  rror from the re
19400 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e  store operation.
19410 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
19420 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
19430 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
19440 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
19450 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
19460 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73  BTREE );.  if( s
19470 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
19480 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
19490 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
194a0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
194b0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
194c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
194d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
194e0 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
194f0 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
19500 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
19510 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
19520 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
19530 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
19540 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
19550 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
19560 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
19570 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
19580 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
19590 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
195a0 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
195b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
195c0 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
195d0 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
195e0 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
195f0 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
19600 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
19610 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
19620 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
19630 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
19640 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
19650 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
19660 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
19670 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
19680 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
19690 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
196a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
196b0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
196c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
196d0 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
196e0 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
196f0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
19700 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
19710 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
19720 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19730 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
19740 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
19750 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69  beCursor **pp, i
19760 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64  nt *piCol){.  Vd
19770 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70  beCursor *p = *p
19780 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
19790 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
197a0 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43  E_BTREE || p->eC
197b0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
197c0 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20  PSEUDO );.  if( 
197d0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
197e0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61  o ){.    int iMa
197f0 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  p;.    if( p->aA
19800 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d  ltMap && (iMap =
19810 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70   p->aAltMap[1+*p
19820 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20  iCol])>0 ){.    
19830 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43    *pp = p->pAltC
19840 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69  ursor;.      *pi
19850 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
19860 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19870 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
19880 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
19890 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
198a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
198b0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
198c0 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
198d0 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
198e0 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
198f0 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
19900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
19920 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
19930 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
19940 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
19950 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
19960 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
19970 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19980 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
19990 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
199a0 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
199b0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
199c0 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
199d0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
199e0 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
199f0 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
19a00 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
19a10 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
19a20 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
19a30 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
19a40 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
19a50 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
19a60 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
19a70 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
19a80 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
19a90 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
19aa0 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
19ab0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
19ac0 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
19ad0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
19ae0 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
19af0 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
19b00 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
19b10 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
19b20 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
19b30 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
19b40 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
19b50 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
19b60 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
19b70 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
19b80 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
19b90 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
19ba0 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
19bb0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
19bc0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
19bd0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
19be0 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
19bf0 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
19c00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
19c10 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
19c20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
19c30 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
19c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
19c50 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
19c60 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
19c70 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
19c80 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
19c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
19ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
19cb0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
19cd0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
19ce0 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
19d00 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
19d10 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
19d20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
19d30 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
19d40 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
19d50 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
19d80 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
19d90 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
19da0 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
19db0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19dc0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
19dd0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
19de0 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
19df0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
19e00 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
19e30 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
19e40 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
19e50 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
19e60 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
19e70 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
19ea0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
19eb0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
19ed0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
19ee0 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
19ef0 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
19f20 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
19f30 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
19f40 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
19f50 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
19f60 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
19f70 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
19f80 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
19f90 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
19fa0 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
19fb0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
19fc0 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
19fd0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
19fe0 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
19ff0 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
1a000 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
1a010 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
1a020 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
1a030 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
1a040 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
1a050 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
1a060 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
1a070 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
1a080 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
1a090 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
1a0a0 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
1a0b0 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
1a0c0 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
1a0d0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
1a0e0 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
1a0f0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1a100 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
1a110 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
1a120 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
1a130 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
1a140 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
1a150 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
1a160 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
1a170 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
1a180 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
1a190 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
1a1a0 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
1a1b0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1a1c0 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
1a1d0 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
1a1e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a1f0 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
1a200 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
1a210 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
1a220 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
1a230 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
1a240 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
1a250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a260 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
1a270 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a290 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
1a2a0 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
1a2b0 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
1a2c0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
1a2d0 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
1a2e0 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
1a2f0 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
1a300 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
1a310 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
1a320 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
1a330 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
1a340 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
1a350 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
1a360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
1a370 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
1a380 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
1a390 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
1a3a0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
1a3b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a3c0 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
1a3d0 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
1a3e0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
1a3f0 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
1a400 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
1a410 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
1a420 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
1a430 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
1a440 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
1a450 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
1a460 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
1a470 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
1a480 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
1a490 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
1a4a0 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
1a4b0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
1a4c0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1a4d0 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
1a4e0 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
1a4f0 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
1a500 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
1a510 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
1a520 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
1a530 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
1a540 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
1a550 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
1a560 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
1a570 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
1a580 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
1a590 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
1a5a0 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
1a5b0 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
1a5c0 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
1a5d0 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
1a5e0 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
1a5f0 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
1a600 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
1a610 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
1a620 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
1a630 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
1a640 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
1a650 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
1a660 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
1a670 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
1a680 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
1a690 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
1a6a0 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
1a6b0 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
1a6c0 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
1a6d0 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
1a6e0 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
1a6f0 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
1a700 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
1a710 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
1a720 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
1a730 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
1a740 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
1a750 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
1a760 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
1a770 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
1a780 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
1a790 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
1a7a0 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
1a7b0 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
1a7c0 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
1a7d0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
1a7e0 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
1a7f0 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
1a800 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1a810 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
1a820 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
1a830 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
1a840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
1a850 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
1a860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1a870 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
1a880 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
1a890 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
1a8a0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
1a8b0 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
1a8c0 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
1a8d0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
1a8e0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
1a8f0 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
1a900 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
1a910 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
1a920 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
1a930 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
1a940 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
1a950 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
1a960 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
1a970 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
1a980 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
1a990 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
1a9a0 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
1a9b0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
1a9c0 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
1a9d0 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
1a9e0 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
1a9f0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
1aa00 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
1aa10 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
1aa20 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
1aa30 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
1aa40 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
1aa50 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
1aa60 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
1aa70 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
1aa80 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
1aa90 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
1aaa0 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
1aab0 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
1aac0 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
1aad0 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
1aae0 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
1aaf0 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
1ab00 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
1ab10 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
1ab20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
1ab30 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
1ab40 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
1ab50 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
1ab60 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
1ab70 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
1ab80 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
1ab90 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
1aba0 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
1abb0 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
1abc0 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
1abd0 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
1abe0 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
1abf0 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
1ac00 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
1ac10 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
1ac20 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
1ac30 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
1ac40 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
1ac50 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
1ac60 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
1ac70 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
1ac80 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
1ac90 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
1aca0 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
1acb0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
1acc0 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
1acd0 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
1ace0 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
1acf0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1ad00 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
1ad10 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1ad20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
1ad30 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
1ad40 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
1ad50 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
1ad60 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
1ad70 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
1ad80 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
1ad90 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
1ada0 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
1adb0 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
1adc0 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
1add0 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
1ade0 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
1adf0 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
1ae00 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
1ae10 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
1ae20 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
1ae30 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
1ae40 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
1ae50 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
1ae60 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
1ae70 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
1ae80 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
1ae90 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
1aea0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1aeb0 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
1aec0 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
1aed0 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
1aee0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
1aef0 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
1af00 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
1af10 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
1af20 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
1af30 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
1af40 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
1af50 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
1af60 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
1af70 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
1af80 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
1af90 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
1afa0 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
1afb0 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
1afc0 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
1afd0 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
1afe0 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
1aff0 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
1b000 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
1b010 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1b020 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
1b030 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
1b040 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
1b050 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
1b060 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
1b070 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
1b080 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
1b090 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
1b0a0 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
1b0b0 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
1b0c0 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
1b0d0 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
1b0e0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1b0f0 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
1b100 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
1b110 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
1b120 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
1b130 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b140 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
1b150 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
1b160 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
1b170 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
1b180 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
1b190 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1b1a0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
1b1b0 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
1b1c0 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
1b1d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1b1e0 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
1b1f0 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
1b200 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
1b210 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
1b220 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
1b230 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
1b240 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
1b250 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
1b260 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
1b270 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
1b280 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
1b290 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
1b2a0 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
1b2b0 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
1b2c0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1b2d0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1b2e0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
1b2f0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
1b300 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
1b310 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
1b320 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
1b330 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
1b340 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
1b350 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
1b360 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
1b370 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
1b380 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
1b390 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
1b3a0 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
1b3b0 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
1b3c0 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
1b3d0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
1b3e0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1b3f0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
1b400 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
1b410 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
1b420 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b430 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
1b440 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
1b450 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1b460 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
1b470 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
1b480 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
1b490 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1b4a0 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
1b4b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
1b4c0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1b4d0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
1b4e0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1b4f0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1b500 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
1b510 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
1b520 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
1b530 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
1b540 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
1b550 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
1b560 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1b570 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
1b580 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
1b590 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1b5a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b5b0 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
1b5c0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1b5d0 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
1b5e0 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
1b5f0 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
1b600 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1b610 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
1b620 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
1b630 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
1b640 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
1b650 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
1b660 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
1b670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
1b680 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
1b690 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
1b6a0 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
1b6b0 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
1b6c0 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
1b6d0 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
1b6e0 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
1b6f0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
1b700 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
1b710 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
1b720 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
1b730 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
1b740 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
1b750 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
1b760 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
1b770 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
1b780 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
1b790 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
1b7a0 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
1b7b0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
1b7c0 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
1b7d0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1b7e0 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
1b7f0 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
1b800 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1b810 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
1b820 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
1b830 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
1b840 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1b850 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1b860 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
1b870 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
1b880 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
1b890 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
1b8a0 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
1b8b0 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
1b8c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
1b8d0 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
1b8e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b8f0 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
1b900 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b910 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1b920 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
1b930 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
1b940 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
1b950 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
1b960 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
1b970 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
1b980 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
1b990 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
1b9a0 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
1b9b0 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
1b9c0 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
1b9d0 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
1b9e0 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
1b9f0 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
1ba00 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
1ba10 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
1ba20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1ba30 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
1ba40 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1ba50 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
1ba60 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
1ba70 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1ba80 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
1ba90 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
1baa0 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
1bab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1bac0 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
1bad0 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
1bae0 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
1baf0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
1bb00 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
1bb10 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
1bb20 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
1bb30 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
1bb40 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
1bb50 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1bb60 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
1bb70 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1bb80 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
1bb90 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1bba0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1bbb0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
1bbc0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
1bbd0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1bbe0 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
1bbf0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1bc00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1bc10 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1bc20 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
1bc30 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1bc40 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
1bc50 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
1bc60 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
1bc70 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
1bc80 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
1bc90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bca0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1bcb0 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
1bcc0 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
1bcd0 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
1bce0 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
1bcf0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1bd00 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
1bd10 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
1bd20 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1bd30 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
1bd40 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
1bd50 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
1bd60 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
1bd70 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
1bd80 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
1bd90 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
1bda0 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
1bdb0 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
1bdc0 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
1bdd0 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
1bde0 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
1bdf0 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
1be00 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1be10 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
1be20 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
1be30 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
1be40 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
1be50 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
1be60 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1be70 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1be80 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1be90 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1bea0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1beb0 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1bec0 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1bed0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1bee0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1bef0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
1bf00 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
1bf10 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
1bf20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
1bf30 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
1bf40 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
1bf50 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1bf60 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1bf70 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1bf80 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1bf90 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1bfb0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1bfc0 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1bfd0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bff0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1c000 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1c010 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
1c020 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1c030 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a     case 10: { /*
1c040 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   Internal use on
1c050 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69  ly: NULL with vi
1c060 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
1c070 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50             ** UP
1c080 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66  DATE no-change f
1c090 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  lag set */.     
1c0a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1c0b0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f  EM_Null|MEM_Zero
1c0c0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1c0d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  = 0;.      pMem-
1c0e0 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20  >u.nZero = 0;.  
1c0f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c100 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
1c110 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
1c120 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
1c130 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
1c140 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  Null */.      /*
1c150 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c160 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75  24078-09375 Valu
1c170 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a  e is a NULL. */.
1c180 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1c190 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
1c1a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c1b0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
1c1c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1c1d0 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31  -OF: R-44885-251
1c1e0 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38  96 Value is an 8
1c1f0 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
1c200 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ment.      ** in
1c210 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1c220 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
1c230 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1c240 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1c250 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1c260 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1c270 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1c280 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1c290 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
1c2a0 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
1c2b0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1c2c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c2d0 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56   R-49794-35026 V
1c2e0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1c2f0 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20  dian 16-bit.    
1c300 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1c310 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1c320 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1c330 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1c340 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1c350 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c360 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1c370 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1c380 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
1c390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c3a0 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1c3b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c3c0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1c3d0 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d  NCE-OF: R-37839-
1c3e0 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61  54301 Value is a
1c3f0 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62   big-endian 24-b
1c400 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1c410 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1c420 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1c430 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
1c440 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1c450 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1c460 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1c470 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1c480 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1c490 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
1c4a0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1c4b0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1c4c0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1c4d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c4e0 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56   R-01849-26079 V
1c4f0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1c500 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20  dian 32-bit.    
1c510 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1c520 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1c530 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1c540 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
1c550 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f  (buf);.#ifdef __
1c560 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20  HP_cc .      /* 
1c570 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69  Work around a si
1c580 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67  gn-extension bug
1c590 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69   in the HP compi
1c5a0 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f  ler for HP/UX */
1c5b0 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30  .      if( buf[0
1c5c0 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75  ]&0x80 ) pMem->u
1c5d0 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66  .i |= 0xffffffff
1c5e0 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64  80000000LL;.#end
1c5f0 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  if.      pMem->f
1c600 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1c610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c620 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1c630 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
1c640 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1c650 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1c660 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1c670 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1c680 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
1c690 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
1c6a0 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
1c6b0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1c6c0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1c6d0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1c6e0 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
1c6f0 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
1c700 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1c710 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1c720 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1c730 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1c740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1c750 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1c760 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
1c770 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
1c780 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1c790 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c7a0 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
1c7b0 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
1c7c0 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
1c7d0 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
1c7e0 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
1c7f0 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
1c800 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
1c810 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
1c820 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
1c830 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
1c840 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1c850 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1c860 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
1c870 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
1c880 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c890 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
1c8a0 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
1c8b0 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
1c8c0 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
1c8d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
1c8e0 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
1c8f0 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
1c900 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1c910 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
1c920 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
1c930 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
1c940 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1c950 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
1c960 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
1c970 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c980 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1c990 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1c9a0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
1c9b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
1c9c0 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
1c9d0 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
1c9e0 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
1c9f0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
1ca00 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
1ca10 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
1ca20 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
1ca30 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
1ca40 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
1ca50 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
1ca60 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
1ca70 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
1ca80 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
1ca90 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
1caa0 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
1cab0 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
1cac0 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
1cad0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
1cae0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
1caf0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1cb00 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
1cb10 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
1cb20 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
1cb30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
1cb40 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
1cb50 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
1cb60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cb70 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
1cb80 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
1cb90 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
1cba0 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
1cbb0 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
1cbc0 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
1cbd0 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
1cbe0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
1cbf0 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
1cc00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1cc10 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
1cc20 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
1cc30 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
1cc40 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
1cc50 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
1cc60 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1cc70 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
1cc80 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
1cc90 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
1cca0 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
1ccb0 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
1ccc0 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
1ccd0 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
1cce0 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
1ccf0 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
1cd00 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
1cd10 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
1cd20 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
1cd30 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1cd40 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1cd50 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
1cd60 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
1cd70 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
1cd80 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
1cd90 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
1cda0 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
1cdb0 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
1cdc0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1cdd0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1cde0 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1cdf0 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
1ce00 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
1ce10 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
1ce20 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
1ce30 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1ce50 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1ce60 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  e record */.){. 
1ce70 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1ce80 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1ce90 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
1cea0 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
1ceb0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ced0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1cee0 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1cef0 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65  or *p */.  nByte
1cf00 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
1cf10 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1cf20 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
1cf30 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  (pKeyInfo->nKeyF
1cf40 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28  ield+1);.  p = (
1cf50 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1cf60 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1cf70 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
1cf80 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
1cf90 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
1cfa0 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
1cfb0 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
1cfc0 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1cfd0 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
1cfe0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1cff0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1d000 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
1d010 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1d020 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
1d030 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b  nfo->nKeyField +
1d040 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1d050 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1d060 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1d070 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1d080 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1d090 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1d0a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1d0b0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1d0c0 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1d0d0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1d0e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1d0f0 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1d100 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1d110 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1d120 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1d130 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1d140 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1d150 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1d160 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1d170 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1d180 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1d190 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1d1a0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1d1b0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1d1c0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1d1d0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1d1e0 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1d1f0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1d200 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1d210 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1d220 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1d230 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1d240 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1d250 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
1d260 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1d290 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1d2a0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1d2b0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1d2d0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1d2e0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1d2f0 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1d300 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1d310 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1d320 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1d330 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1d340 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1d350 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1d360 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1d370 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1d380 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1d390 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
1d3a0 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
1d3b0 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
1d3c0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1d3d0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
1d3e0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
1d3f0 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
1d400 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
1d410 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
1d420 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
1d430 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
1d440 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1d450 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
1d460 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
1d470 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1d480 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d  oc = 0;.    pMem
1d490 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  ->z = 0;.    d +
1d4a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1d4b0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
1d4c0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
1d4d0 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
1d4e0 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
1d4f0 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
1d500 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
1d510 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b   u<=pKeyInfo->nK
1d520 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  eyField + 1 );. 
1d530 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1d540 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1d550 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
1d560 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1d570 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72  res two index or
1d580 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65   table record ke
1d590 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ys in the same w
1d5a0 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c  ay.** as the sql
1d5b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1d5c0 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e  mpare() routine.
1d5d0 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f   Unlike VdbeReco
1d5e0 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20  rdCompare(),.** 
1d5f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
1d600 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63  serializes and c
1d610 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75  ompares values u
1d620 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
1d630 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1d640 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65  () and sqlite3Me
1d650 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74  mCompare() funct
1d660 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64  ions. It is used
1d670 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
1d680 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
1d690 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70  sure that the op
1d6a0 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a  timized code in.
1d6b0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
1d6c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65  cordCompare() re
1d6d0 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69  turns results wi
1d6e0 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69  th these two pri
1d6f0 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  mitives..**.** R
1d700 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1d710 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1d720 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61  arison is equiva
1d730 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52  lent to desiredR
1d740 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  esult..** Return
1d750 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20   false if there 
1d760 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e  is a disagreemen
1d770 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1d780 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1d790 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e  reDebug(.  int n
1d7a0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1d7b0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1d7c0 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1d7d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1d7e0 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74  pPKey2, /* Right
1d7f0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65   key */.  int de
1d800 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20  siredResult     
1d810 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65          /* Corre
1d820 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a  ct answer */.){.
1d830 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1d840 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1d850 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1d860 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1d870 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1d880 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1d890 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1d8a0 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
1d8b0 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
1d8c0 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
1d8d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1d8e0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1d8f0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1d900 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
1d910 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1d920 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1d930 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1d940 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
1d950 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
1d960 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
1d970 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1d980 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79  Info;.  if( pKey
1d990 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65  Info->db==0 ) re
1d9a0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65  turn 1;.  mem1.e
1d9b0 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1d9c0 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20  nc;.  mem1.db = 
1d9d0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1d9e0 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  /* mem1.flags = 
1d9f0 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69  0;  // Will be i
1da00 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71  nitialized by sq
1da10 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1da20 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e  et() */.  VVA_ON
1da30 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1da40 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1da50 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1da60 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1da70 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
1da80 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
1da90 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
1daa0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
1dab0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
1dac0 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
1dad0 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
1dae0 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
1daf0 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
1db00 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
1db10 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
1db20 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
1db30 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
1db40 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
1db50 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
1db60 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
1db70 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
1db80 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
1db90 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
1dba0 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
1dbb0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1dbc0 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
1dbd0 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
1dbe0 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
1dbf0 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
1dc00 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
1dc10 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
1dc20 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
1dc30 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
1dc40 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
1dc50 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
1dc60 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
1dc70 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
1dc80 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
1dc90 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1dca0 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20   szHdr1);.  if( 
1dcb0 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72  szHdr1>98307 ) r
1dcc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1dcd0 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48  RUPT;.  d1 = szH
1dce0 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr1;.  assert( p
1dcf0 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1dd00 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1dd10 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
1dd20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1dd30 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1dd40 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1dd50 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  t( pKeyInfo->nKe
1dd60 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  yField>0 );.  as
1dd70 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
1dd80 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
1dd90 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
1dda0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
1ddb0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1ddc0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
1ddd0 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
1dde0 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
1ddf0 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
1de00 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
1de10 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
1de20 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ype1 );..    /* 
1de30 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72  Verify that ther
1de40 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20  e is enough key 
1de50 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20  space remaining 
1de60 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20  to avoid.    ** 
1de70 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  a buffer overrea
1de80 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69  d.  The "d1+seri
1de90 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65  al_type1+2" sube
1dea0 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20  xpression will. 
1deb0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
1dec0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1ded0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f  equal to the amo
1dee0 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20  unt of required 
1def0 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  key space..    *
1df00 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f  * Use that appro
1df10 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69  ximation to avoi
1df20 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e  d the more expen
1df30 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20  sive call to.   
1df40 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53   ** sqlite3VdbeS
1df50 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69  erialTypeLen() i
1df60 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1df70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1df80 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65  ( d1+serial_type
1df90 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20  1+2>(u32)nKey1. 
1dfa0 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65      && d1+sqlite
1dfb0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1dfc0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
1dfd0 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20  >(u32)nKey1 .   
1dfe0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1dff0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
1e000 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1e010 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
1e020 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
1e030 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1e040 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1e050 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
1e060 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
1e070 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
1e080 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
1e090 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
1e0a0 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
1e0b0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70  Key2->aMem[i], p
1e0c0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1e0d0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
1e0e0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1e0f0 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1e100 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1e110 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1e120 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1e130 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1e140 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1e150 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72  = -rc;  /* Inver
1e160 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  t the result for
1e170 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
1e180 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
1e190 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d     goto debugCom
1e1a0 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20  pareEnd;.    }. 
1e1b0 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65     i++;.  }while
1e1c0 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
1e1d0 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1e1e0 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  d );..  /* No me
1e1f0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1e200 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1e210 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1e220 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1e230 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1e240 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1e250 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1e260 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1e270 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1e280 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1e290 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1e2a0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
1e2b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1e2c0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1e2d0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1e2e0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1e2f0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
1e300 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
1e310 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
1e320 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
1e330 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
1e340 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
1e350 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
1e360 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  alue.  */.  rc =
1e370 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1e380 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61  _rc;..debugCompa
1e390 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73  reEnd:.  if( des
1e3a0 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26  iredResult==0 &&
1e3b0 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   rc==0 ) return 
1e3c0 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1e3d0 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30  Result<0 && rc<0
1e3e0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1e3f0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1e400 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74  >0 && rc>0 ) ret
1e410 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52  urn 1;.  if( COR
1e420 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1e430 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   1;.  if( pKeyIn
1e440 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1e450 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1e460 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1e470 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1e480 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1e490 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1e4a0 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b  r of fields (a.k
1e4b0 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20  .a. columns) in 
1e4c0 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
1e4d0 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79   by.** pKey,nKey
1e4e0 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68  .  The verify th
1e4f0 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73  at this count is
1e500 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1e510 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69  ual to the.** li
1e520 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65  mit given by pKe
1e530 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1e540 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1e550 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f  constraint is no
1e560 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20  t satisfied, it 
1e570 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68  means that the h
1e580 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62  igh-speed.** vdb
1e590 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1e5a0 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f  t() and vdbeReco
1e5b0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1e5c0 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a  ) routines will.
1e5d0 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ** not work corr
1e5e0 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20  ectly.  If this 
1e5f0 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69  assert() ever fi
1e600 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79  res, it probably
1e610 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74   means.** that t
1e620 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46  he KeyInfo.nKeyF
1e630 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1e640 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65 73  nAllField values
1e650 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a   were computed.*
1e660 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  * incorrectly..*
1e670 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
1e680 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1e690 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a  ntWithinLimits(.
1e6a0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
1e6b0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1e6c0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f  /* The record to
1e6d0 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f   verify */ .  co
1e6e0 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  nst KeyInfo *pKe
1e6f0 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43  yInfo       /* C
1e700 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68  ompare size with
1e710 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f   this KeyInfo */
1e720 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  .){.  int nField
1e730 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64   = 0;.  u32 szHd
1e740 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  r;.  u32 idx;.  
1e750 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63  u32 notUsed;.  c
1e760 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1e770 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1e780 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1e790 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f  )pKey;..  if( CO
1e7a0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1e7b0 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  n;.  idx = getVa
1e7c0 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1e7d0 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  dr);.  assert( n
1e7e0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
1e7f0 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29  rt( szHdr<=(u32)
1e800 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28  nKey );.  while(
1e810 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20   idx<szHdr ){.  
1e820 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1e830 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e  nt32(aKey+idx, n
1e840 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69  otUsed);.    nFi
1e850 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  eld++;.  }.  ass
1e860 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70  ert( nField <= p
1e870 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1e880 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ld );.}.#else.# 
1e890 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72  define vdbeAsser
1e8a0 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1e8b0 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23  nLimits(A,B,C).#
1e8c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74  endif../*.** Bot
1e8d0 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d  h *pMem1 and *pM
1e8e0 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69  em2 contain stri
1e8f0 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61  ng values. Compa
1e900 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
1e910 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63  s.** using the c
1e920 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1e930 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61  e pColl. As usua
1e940 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61  l, return a nega
1e950 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  tive , zero.** o
1e960 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  r positive value
1e970 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65   if *pMem1 is le
1e980 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1e990 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  o or greater tha
1e9a0 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65  n .** *pMem2, re
1e9b0 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69  spectively. Simi
1e9c0 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f  lar in spirit to
1e9d0 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20   "rc = (*pMem1) 
1e9e0 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f  - (*pMem2);"..*/
1e9f0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1ea00 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1ea10 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  (.  const Mem *p
1ea20 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65  Mem1,.  const Me
1ea30 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73  m *pMem2,.  cons
1ea40 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1ea50 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20  ,.  u8 *prcErr  
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d      /* If an OOM
1ea80 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20   occurs, set to 
1ea90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a  SQLITE_NOMEM */.
1eaa0 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  ){.  if( pMem1->
1eab0 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
1eac0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ){.    /* The st
1ead0 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64  rings are alread
1eae0 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  y in the correct
1eaf0 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c   encoding.  Call
1eb00 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d   the.     ** com
1eb10 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
1eb20 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20   directly */.   
1eb30 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78   return pColl->x
1eb40 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1eb50 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d  ,pMem1->n,pMem1-
1eb60 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d  >z,pMem2->n,pMem
1eb70 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2->z);.  }else{.
1eb80 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1eb90 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
1eba0 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b  *v2;.    Mem c1;
1ebb0 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20  .    Mem c2;.   
1ebc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1ebd0 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e  nit(&c1, pMem1->
1ebe0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1ebf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1ec00 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31  mInit(&c2, pMem1
1ec10 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1ec20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ec30 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1ec40 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45  c1, pMem1, MEM_E
1ec50 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  phem);.    sqlit
1ec60 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1ec70 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c  Copy(&c2, pMem2,
1ec80 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1ec90 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v1 = sqlite3Val
1eca0 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1ecb0 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c  value*)&c1, pCol
1ecc0 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32 20  l->enc);.    v2 
1ecd0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1ece0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1ecf0 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c2, pColl->e
1ed00 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  nc);.    if( (v1
1ed10 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b  ==0 || v2==0) ){
1ed20 0a 20 20 20 20 20 20 69 66 28 20 70 72 63 45 72  .      if( prcEr
1ed30 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51  r ) *prcErr = SQ
1ed40 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1ed50 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
1ed60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ed70 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1ed80 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63  (pColl->pUser, c
1ed90 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76  1.n, v1, c2.n, v
1eda0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
1edb0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1edc0 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
1edd0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1ede0 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65  ase(&c2);.    re
1edf0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1ee00 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
1ee10 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74  pBlob is guarant
1ee20 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62  eed to be a Blob
1ee30 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72   that is not mar
1ee40 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f  ked.** with MEM_
1ee50 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72  Zero.  Return tr
1ee60 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62  ue if it could b
1ee70 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a  e a zero-blob..*
1ee80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
1ee90 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61  llZero(const cha
1eea0 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
1eeb0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1eec0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1eed0 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75   if( z[i] ) retu
1eee0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1eef0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1ef00 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73  ompare two blobs
1ef10 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1ef20 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1ef30 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1ef40 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  st.** is less th
1ef50 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1ef60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1ef70 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63  e second, respec
1ef80 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e  tively..** If on
1ef90 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66  e blob is a pref
1efa0 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
1efb0 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65   then the shorte
1efc0 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e  r is the lessor.
1efd0 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  .*/.SQLITE_NOINL
1efe0 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42  INE int sqlite3B
1eff0 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  lobCompare(const
1f000 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74   Mem *pB1, const
1f010 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e   Mem *pB2){.  in
1f020 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20  t c;.  int n1 = 
1f030 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32  pB1->n;.  int n2
1f040 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a   = pB2->n;..  /*
1f050 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
1f060 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76  to have a Blob v
1f070 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73 6f  alue that has so
1f080 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74  me non-zero cont
1f090 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65  ent.  ** followe
1f0a0 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e  d by zero conten
1f0b0 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c  t.  But that onl
1f0c0 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42  y comes up for B
1f0d0 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a  lobs formed.  **
1f0e0 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1f0f0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e  ecord opcode, an
1f100 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76  d such Blobs nev
1f110 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69 6e  er get passed in
1f120 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d  to.  ** sqlite3M
1f130 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a  emCompare(). */.
1f140 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e    assert( (pB1->
1f150 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1f160 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b  )==0 || n1==0 );
1f170 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32 2d  .  assert( (pB2-
1f180 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1f190 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29  o)==0 || n2==0 )
1f1a0 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66  ;..  if( (pB1->f
1f1b0 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29  lags|pB2->flags)
1f1c0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1f1d0 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67     if( pB1->flag
1f1e0 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26  s & pB2->flags &
1f1f0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1f200 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75     return pB1->u
1f210 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e  .nZero - pB2->u.
1f220 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  nZero;.    }else
1f230 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20   if( pB1->flags 
1f240 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1f250 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1f260 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e  ro(pB2->z, pB2->
1f270 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  n) ) return -1;.
1f280 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31        return pB1
1f290 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a  ->u.nZero - n2;.
1f2a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f2b0 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28   if( !isAllZero(
1f2c0 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20  pB1->z, pB1->n) 
1f2d0 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1f2e0 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70     return n1 - p
1f2f0 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  B2->u.nZero;.   
1f300 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d   }.  }.  c = mem
1f310 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d  cmp(pB1->z, pB2-
1f320 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a  >z, n1>n2 ? n2 :
1f330 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20   n1);.  if( c ) 
1f340 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75  return c;.  retu
1f350 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f  rn n1 - n2;.}../
1f360 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72  *.** Do a compar
1f370 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36  ison between a 6
1f380 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
1f390 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69  eger and a 64-bi
1f3a0 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  t floating-point
1f3b0 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  .** number.  Ret
1f3c0 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1f3d0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1f3e0 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36  if the first (i6
1f3f0 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  4) is less than,
1f400 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  .** equal to, or
1f410 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1f420 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65  e second (double
1f430 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1f440 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1f450 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64  Compare(i64 i, d
1f460 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20  ouble r){.  if( 
1f470 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c  sizeof(LONGDOUBL
1f480 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20  E_TYPE)>8 ){.   
1f490 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
1f4a0 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45   x = (LONGDOUBLE
1f4b0 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28  _TYPE)i;.    if(
1f4c0 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   x<r ) return -1
1f4d0 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20  ;.    if( x>r ) 
1f4e0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1f4f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1f500 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20  {.    i64 y;.   
1f510 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69   double s;.    i
1f520 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36  f( r<-9223372036
1f530 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65  854775808.0 ) re
1f540 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28  turn +1;.    if(
1f550 20 72 3e 3d 39 32 32 33 33 37 32 30 33 36 38 35   r>=922337203685
1f560 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75  4775808.0 ) retu
1f570 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28  rn -1;.    y = (
1f580 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69  i64)r;.    if( i
1f590 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <y ) return -1;.
1f5a0 20 20 20 20 69 66 28 20 69 3e 79 20 29 20 72 65      if( i>y ) re
1f5b0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 73 20 3d  turn +1;.    s =
1f5c0 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20   (double)i;.    
1f5d0 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e  if( s<r ) return
1f5e0 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72   -1;.    if( s>r
1f5f0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1f600 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1f610 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1f620 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
1f630 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
1f640 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
1f650 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
1f660 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
1f670 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
1f680 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1f690 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1f6a0 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
1f6b0 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
1f6c0 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
1f6d0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
1f6e0 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
1f6f0 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
1f700 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
1f710 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
1f720 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
1f730 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1f740 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
1f750 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
1f760 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
1f770 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
1f780 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
1f790 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
1f7a0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1f7b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f7c0 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
1f7d0 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
1f7e0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
1f7f0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1f800 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20  oll){.  int f1, 
1f810 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
1f820 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
1f830 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
1f840 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
1f850 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
1f860 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
1f870 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
1f880 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74  3VdbeMemIsRowSet
1f890 28 70 4d 65 6d 31 29 20 26 26 20 21 73 71 6c 69  (pMem1) && !sqli
1f8a0 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
1f8b0 65 74 28 70 4d 65 6d 32 29 20 29 3b 0a 20 0a 20  et(pMem2) );. . 
1f8c0 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1f8d0 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
1f8e0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
1f8f0 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
1f900 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
1f910 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
1f920 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1f930 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
1f940 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
1f950 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
1f960 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
1f970 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  ..  /* At least 
1f980 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76  one of the two v
1f990 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65  alues is a numbe
1f9a0 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  r.  */.  if( com
1f9b0 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1f9c0 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1f9d0 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1f9e0 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
1f9f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1fa00 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
1fa10 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
1fa20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1fa30 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
1fa40 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.i ) return +1
1fa50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1fa60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fa70 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52  (f1 & f2 & MEM_R
1fa80 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1fa90 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1faa0 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  < pMem2->u.r ) r
1fab0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1fac0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e  if( pMem1->u.r >
1fad0 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1fae0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1faf0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1fb00 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49     if( (f1&MEM_I
1fb10 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1fb20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
1fb30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1fb40 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
1fb50 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
1fb60 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d  em1->u.i, pMem2-
1fb70 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
1fb80 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1fb90 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
1fba0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1fbb0 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1fbc0 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1fbd0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1fbe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71        return -sq
1fbf0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1fc00 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c  pare(pMem2->u.i,
1fc10 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20   pMem1->u.r);.  
1fc20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fc30 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1fc40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fc50 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a  return +1;.  }..
1fc60 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1fc70 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
1fc80 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1fc90 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1fca0 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1fcb0 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1fcc0 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1fcd0 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1fce0 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1fcf0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1fd00 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1fd10 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1fd20 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1fd30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1fd40 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1fd50 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1fd60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1fd70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1fd80 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1fd90 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70  =pMem2->enc || p
1fda0 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Mem1->db->malloc
1fdb0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
1fdc0 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1fdd0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1fde0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1fdf0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1fe00 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1fe10 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1fe20 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1fe30 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1fe40 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1fe50 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1fe60 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1fe70 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1fe80 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1fe90 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1fea0 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1feb0 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1fec0 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1fed0 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1fee0 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1fef0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1ff00 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1ff10 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1ff20 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1ff30 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1ff40 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1ff50 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1ff60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1ff70 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1ff80 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1ff90 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1ffa0 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1ffb0 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1ffc0 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1ffd0 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1ffe0 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1fff0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
20000 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
20010 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
20020 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
20030 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
20040 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
20050 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
20060 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
20070 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
20080 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
20090 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
200a0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
200b0 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
200c0 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
200d0 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
200e0 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
200f0 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
20100 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
20110 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
20120 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
20130 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
20140 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
20150 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
20160 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
20170 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
20180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
20190 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
201a0 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
201b0 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
201c0 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
201d0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
201e0 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
201f0 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
20200 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
20210 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
20220 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
20230 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
20240 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
20250 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20260 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
20270 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
20280 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
20290 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
202a0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
202b0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
202c0 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
202d0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
202e0 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
202f0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
20300 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
20310 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
20320 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
20330 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
20340 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
20350 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
20360 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
20370 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
20380 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
20390 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
203a0 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
203b0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
203c0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
203d0 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
203e0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
203f0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
20400 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
20410 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
20420 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
20430 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
20440 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
20450 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
20460 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
20470 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
20480 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
20490 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
204a0 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
204b0 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
204c0 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
204d0 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
204e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
204f0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
20500 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
20510 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
20520 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
20530 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
20540 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
20550 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
20560 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
20570 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
20580 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
20590 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
205a0 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
205b0 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
205c0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
205d0 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
205e0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
205f0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
20600 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
20610 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
20620 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
20630 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
20640 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
20650 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
20660 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
20670 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
20680 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
20690 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
206a0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
206b0 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
206c0 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
206d0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
206e0 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
206f0 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
20700 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
20710 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
20720 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
20730 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
20740 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
20750 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
20760 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
20770 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
20780 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
20790 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
207a0 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
207b0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
207c0 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
207d0 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
207e0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
207f0 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
20800 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
20810 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
20820 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
20830 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
20840 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
20850 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
20860 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
20870 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
20880 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
20890 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
208a0 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
208b0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
208c0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
208d0 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
208e0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
208f0 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
20900 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
20910 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
20920 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
20930 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
20940 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
20950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
20960 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
20970 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
20980 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
209b0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
209c0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
209d0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
20a00 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
20a10 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
20a20 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
20a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20a40 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
20a50 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
20a60 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
20a90 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
20aa0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
20ab0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20ac0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
20ad0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
20ae0 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
20af0 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
20b00 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
20b10 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
20b20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
20b30 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
20b40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
20b50 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
20b60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
20b70 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
20b80 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
20b90 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
20ba0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
20bb0 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
20bc0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
20bd0 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
20be0 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
20bf0 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
20c00 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
20c10 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
20c20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
20c30 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
20c40 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
20c50 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
20c60 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
20c70 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
20c80 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
20c90 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
20ca0 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
20cb0 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
20cc0 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
20cd0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
20ce0 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
20cf0 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
20d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
20d10 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
20d20 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
20d30 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
20d40 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 20      i = 0;.  }. 
20d50 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65   if( d1>(unsigne
20d60 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20  d)nKey1 ){ .    
20d70 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
20d80 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
20d90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
20da0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
20db0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 7d 0a 0a  ruption */.  }..
20dc0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
20dd0 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
20de0 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
20df0 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
20e00 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65  ements */.  asse
20e10 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
20e20 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e  Info->nAllField>
20e30 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
20e40 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
20e50 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
20e60 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
20e70 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
20e80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20e90 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
20ea0 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b  ->nKeyField>0 );
20eb0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
20ec0 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
20ed0 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
20ee0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
20ef0 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20  pe;..    /* RHS 
20f00 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  is an integer */
20f10 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66  .    if( pRhs->f
20f20 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
20f30 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
20f40 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
20f50 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ];.      testcas
20f60 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
20f70 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
20f80 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
20f90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20fa0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
20fb0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
20fc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
20fd0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
20fe0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
20ff0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
21000 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
21010 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
21020 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
21030 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72  mem1);.        r
21040 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  c = -sqlite3IntF
21050 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73  loatCompare(pRhs
21060 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29  ->u.i, mem1.u.r)
21070 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21080 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
21090 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
210a0 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
210b0 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
210c0 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
210d0 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
210e0 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
210f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21100 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
21110 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
21120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21130 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
21140 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21150 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
21160 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
21170 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
21180 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
21190 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
211a0 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
211b0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
211c0 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
211d0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
211e0 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20  s 12 or greater 
211f0 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20  are strings and 
21200 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74  blobs (greater t
21210 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  han.        ** n
21220 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31  umbers). Types 1
21230 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72  0 and 11 are cur
21240 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64  rently "reserved
21250 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20   for future .   
21260 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f       ** use", so
21270 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c   it doesn't real
21280 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74  ly matter what t
21290 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f  he results of co
212a0 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20  mparing.        
212b0 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65  ** them to numbe
212c0 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20  ric values are. 
212d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
212e0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
212f0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
21310 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
21320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
21330 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
21340 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
21350 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
21360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
21370 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
21380 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
21390 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e  em1.u.r<pRhs->u.
213a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
213b0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
213c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
213d0 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72  m1.u.r>pRhs->u.r
213e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
213f0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
21400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
21410 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
21420 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f   = sqlite3IntFlo
21430 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75  atCompare(mem1.u
21440 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a  .i, pRhs->u.r);.
21450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21460 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
21470 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20  RHS is a string 
21480 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
21490 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
214a0 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67  M_Str ){.      g
214b0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
214c0 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
214d0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
214e0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
214f0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
21500 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
21510 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
21520 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
21530 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
21540 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
21550 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
21560 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21570 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28        mem1.n = (
21580 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
21590 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
215a0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
215b0 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  1.n)==(unsigned)
215c0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
215d0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
215e0 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67  em1.n+1)==(unsig
215f0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
21600 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
21610 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
21620 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
21630 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
21640 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
21650 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21660 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
21670 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21680 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
21690 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
216a0 20 69 66 28 20 28 70 4b 65 79 49 6e 66 6f 20 3d   if( (pKeyInfo =
216b0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
216c0 6f 29 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  o)->aColl[i] ){.
216d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65            mem1.e
216e0 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
216f0 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  nc;.          me
21700 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
21710 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
21720 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  mem1.flags = MEM
21730 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  _Str;.          
21740 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29  mem1.z = (char*)
21750 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20  &aKey1[d1];.    
21760 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
21770 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
21780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
21790 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79  mem1, pRhs, pKey
217a0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20  Info->aColl[i], 
217b0 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65  &pPKey2->errCode
217c0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
217d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
217e0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
217f0 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52  = MIN(mem1.n, pR
21800 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
21810 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
21820 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
21830 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
21840 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
21850 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52  rc = mem1.n - pR
21860 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20  hs->n; .        
21870 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
21880 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
21890 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73   blob */.    els
218a0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
218b0 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  s & MEM_Blob ){.
218c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
218d0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
218e0 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68  _Zero)==0 || pRh
218f0 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  s->n==0 );.     
21900 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
21910 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
21920 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
21930 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
21940 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
21950 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
21960 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f  e<12 || (serial_
21970 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
21980 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
21990 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
219a0 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d        int nStr =
219b0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
219c0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
219d0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
219e0 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  Str)==(unsigned)
219f0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
21a00 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
21a10 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  Str+1)==(unsigne
21a20 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
21a30 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29     if( (d1+nStr)
21a40 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
21a50 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
21a60 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
21a70 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
21a80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
21a90 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ab0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
21ac0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
21ad0 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
21ae0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
21af0 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
21b00 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  ero((const char*
21b10 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72  )&aKey1[d1],nStr
21b20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
21b30 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
21b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21b50 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74 72 20        rc = nStr 
21b60 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b  - pRhs->u.nZero;
21b70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21b80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21b90 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
21ba0 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d   MIN(nStr, pRhs-
21bb0 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
21bc0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
21bd0 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
21be0 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
21bf0 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
21c00 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e  = nStr - pRhs->n
21c10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21c20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21c30 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f  * RHS is null */
21c40 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
21c50 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
21c60 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
21c70 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74    rc = (serial_t
21c80 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a  ype!=0);.    }..
21c90 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
21ca0 0a 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79  .      if( pPKey
21cb0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
21cc0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
21cd0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
21ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
21cf0 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
21d00 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
21d10 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21d20 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20  2, rc) );.      
21d30 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
21d40 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
21d50 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
21d60 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
21d70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
21d80 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3d   i++;.    if( i=
21d90 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
21da0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 52 68  ) break;.    pRh
21db0 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73  s++;.    d1 += s
21dc0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
21dd0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
21de0 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b  ype);.    idx1 +
21df0 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
21e00 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
21e10 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
21e20 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31  (unsigned)szHdr1
21e30 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65   && d1<=(unsigne
21e40 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a  d)nKey1 );..  /*
21e50 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
21e60 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
21e70 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
21e80 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
21e90 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
21ea0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
21eb0 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
21ec0 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
21ed0 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
21ee0 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
21ef0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
21f00 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
21f10 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  1).  */.  assert
21f20 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
21f30 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
21f40 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
21f50 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  t one or both of
21f60 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
21f70 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
21f80 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
21f90 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
21fa0 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
21fb0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
21fc0 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
21fd0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
21fe0 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
21ff0 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72      || vdbeRecor
22000 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
22010 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
22020 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  y2, pPKey2->defa
22030 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20  ult_rc) .       
22040 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
22050 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
22060 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b  ailed.  );.  pPK
22070 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
22080 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
22090 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
220a0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
220b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
220c0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
220d0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
220e0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
220f0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
22100 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20  *pPKey2         
22110 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
22120 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
22130 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22140 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
22150 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
22160 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  y2, 0);.}.../*.*
22170 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22180 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
22190 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
221a0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
221b0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
221c0 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
221d0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
221e0 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
221f0 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
22200 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
22210 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
22220 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
22230 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
22240 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
22250 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
22260 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
22270 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
22280 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
22290 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
222a0 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
222b0 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
222c0 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
222d0 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
222e0 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
222f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22300 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
22310 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
22320 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
22330 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
22340 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
22350 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
22360 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
22370 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
22380 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
22390 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
223a0 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
223b0 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
223c0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
223d0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
223e0 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
223f0 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
22400 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36  x;.  i64 v;.  i6
22410 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73  4 lhs;..  vdbeAs
22420 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
22430 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
22440 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
22450 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73  >pKeyInfo);.  as
22460 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
22470 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
22480 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
22490 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
224a0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
224b0 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
224c0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
224d0 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
224e0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
224f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
22500 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
22510 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
22520 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
22530 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
22540 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
22550 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
22560 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
22570 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
22580 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22590 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
225a0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
225b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
225c0 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
225d0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
225e0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
225f0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
22600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22610 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
22620 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
22630 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
22640 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
22650 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
22660 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
22670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
22680 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
22690 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
226a0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
226b0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
226c0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
226d0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
226e0 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
226f0 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
22700 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
22710 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
22720 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
22730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22740 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
22750 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
22760 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
22770 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
22780 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
22790 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
227a0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
227b0 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
227c0 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
227d0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
227e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
227f0 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
22800 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
22810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
22820 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
22830 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
22840 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
22850 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
22860 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
22870 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
22880 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
22890 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
228a0 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
228b0 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
228c0 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
228d0 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
228e0 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
228f0 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
22900 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
22910 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
22920 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
22930 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
22940 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
22950 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
22960 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
22970 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
22980 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
22990 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
229a0 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
229b0 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
229c0 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
229d0 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
229e0 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
229f0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
22a00 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
22a10 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
22a20 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20  , pPKey2);..    
22a30 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
22a40 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
22a50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22a60 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22a70 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  ey2);.  }..  v =
22a80 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
22a90 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68  .u.i;.  if( v>lh
22aa0 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
22ab0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
22ac0 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
22ad0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
22ae0 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
22af0 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
22b00 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >1 ){.    /* The
22b10 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
22b20 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
22b30 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65  e equal. Compare
22b40 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20   the trailing . 
22b50 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a     ** fields.  *
22b60 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  /.    res = sqli
22b70 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22b80 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
22b90 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
22ba0 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
22bb0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
22bc0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
22bd0 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
22be0 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  l and there are 
22bf0 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20  no trailing.    
22c00 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72  ** fields. Retur
22c10 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
22c20 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73  t_rc in this cas
22c30 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  e. */.    res = 
22c40 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
22c50 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e  rc;.    pPKey2->
22c60 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a  eqSeen = 1;.  }.
22c70 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
22c80 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
22c90 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
22ca0 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a  pPKey2, res) );.
22cb0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
22cc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22cd0 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
22ce0 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
22cf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22d00 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
22d10 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
22d20 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
22d30 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74  2 is a string, t
22d40 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73  hat (b) the firs
22d50 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20  t field.** uses 
22d60 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
22d70 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e  quence BINARY an
22d80 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73  d (c) that the s
22d90 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
22da0 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20  rint .** at the 
22db0 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
22dc0 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
22dd0 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f   single byte..*/
22de0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
22df0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
22e00 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ing(.  int nKey1
22e10 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
22e20 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
22e30 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
22e40 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
22e50 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
22e60 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
22e70 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  8 *aKey1 = (cons
22e80 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69  t u8*)pKey1;.  i
22e90 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  nt serial_type;.
22ea0 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
22eb0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d  sert( pPKey2->aM
22ec0 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45  em[0].flags & ME
22ed0 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41  M_Str );.  vdbeA
22ee0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
22ef0 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
22f00 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
22f10 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67  ->pKeyInfo);.  g
22f20 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
22f30 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
22f40 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e);.  if( serial
22f50 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
22f60 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
22f70 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
22f80 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d  /nKey1) is a num
22f90 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f  ber or a null */
22fa0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73  .  }else if( !(s
22fb0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
22fc0 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d  1) ){ .    res =
22fd0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20   pPKey2->r2;    
22fe0 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
22ff0 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  1) is a blob */.
23000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
23010 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e   nCmp;.    int n
23020 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48  Str;.    int szH
23030 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a  dr = aKey1[0];..
23040 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69      nStr = (seri
23050 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b  al_type-12) / 2;
23060 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20  .    if( (szHdr 
23070 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20  + nStr) > nKey1 
23080 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  ){.      pPKey2-
23090 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
230a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
230b0 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
230c0 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
230d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
230e0 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
230f0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
23100 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
23110 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
23120 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
23130 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
23140 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
23150 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
23160 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
23170 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
23180 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
23190 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
231a0 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
231b0 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
231c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
231d0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
231e0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
231f0 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20  PKey2, 1);.     
23200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23210 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
23220 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
23230 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
23240 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  eqSeen = 1;.    
23250 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
23260 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
23270 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
23280 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d  ey2->r2;.      }
23290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
232a0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
232b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
232c0 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
232d0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
232e0 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
232f0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
23300 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a  Key2->r1;.    }.
23310 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
23320 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
23330 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
23340 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
23350 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
23360 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  PT_DB.       || 
23370 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
23380 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
23390 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
233a0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   res;.}../*.** R
233b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
233c0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62  to an sqlite3Vdb
233d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
233e0 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63   compatible func
233f0 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65  tion.** suitable
23400 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73   for comparing s
23410 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64  erialized record
23420 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65  s to the unpacke
23430 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a  d record passed.
23440 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
23450 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f  rgument..*/.Reco
23460 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65  rdCompare sqlite
23470 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
23480 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
23490 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74  *p){.  /* varint
234a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
234b0 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63  () and varintRec
234c0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
234d0 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20  () both assume. 
234e0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a   ** that the siz
234f0 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
23500 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  nt that occurs a
23510 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
23520 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  ach record.  ** 
23530 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
23540 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31   byte (i.e. is 1
23550 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72  27 or less). var
23560 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
23570 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20  Int().  ** also 
23580 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
23590 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72  is safe to overr
235a0 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20  ead a buffer by 
235b0 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20  at least the .  
235c0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  ** maximum possi
235d0 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72  ble legal header
235e0 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74   size plus 8 byt
235f0 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72  es. Because ther
23600 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e  e is.  ** guaran
23610 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65  teed to be at le
23620 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20  ast 74 (but not 
23630 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61  136) bytes of pa
23640 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  dding following 
23650 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  each.  ** buffer
23660 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e   passed to varin
23670 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
23680 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69  t() this makes i
23690 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a  t convenient to.
236a0 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73    ** limit the s
236b0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
236c0 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e  r to 64 bytes in
236d0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
236e0 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a   first field.  *
236f0 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  * is an integer.
23700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65  .  **.  ** The e
23710 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e  asiest way to en
23720 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74  force this limit
23730 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20   is to consider 
23740 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74  only records wit
23750 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73  h.  ** 13 fields
23760 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65   or less. If the
23770 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20   first field is 
23780 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20  an integer, the 
23790 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20  maximum legal.  
237a0 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  ** header size i
237b0 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29  s (12*5 + 1 + 1)
237c0 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66   bytes.  */.  if
237d0 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( p->pKeyInfo->n
237e0 41 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a  AllField<=13 ){.
237f0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
23800 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  p->aMem[0].flags
23810 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65  ;.    if( p->pKe
23820 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
23830 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d  r[0] ){.      p-
23840 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  >r1 = 1;.      p
23850 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  ->r2 = -1;.    }
23860 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
23870 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  1 = -1;.      p-
23880 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  >r2 = 1;.    }. 
23890 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
238a0 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20  MEM_Int) ){.    
238b0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
238c0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20  ordCompareInt;. 
238d0 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
238e0 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  e( flags & MEM_R
238f0 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  eal );.    testc
23900 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
23910 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Null );.    tes
23920 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
23930 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69  EM_Blob );.    i
23940 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d  f( (flags & (MEM
23950 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d  _Real|MEM_Null|M
23960 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20  EM_Blob))==0 && 
23970 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  p->pKeyInfo->aCo
23980 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ll[0]==0 ){.    
23990 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
239a0 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20  & MEM_Str );.   
239b0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
239c0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
239d0 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
239e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
239f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b  beRecordCompare;
23a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  .}../*.** pCur p
23a10 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
23a20 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
23a30 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
23a40 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
23a50 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
23a60 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
23a70 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
23a80 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
23a90 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
23aa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
23ab0 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
23ac0 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
23ad0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
23ae0 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
23af0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
23b00 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
23b10 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
23b20 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
23b30 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
23b40 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
23b50 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
23b60 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
23b70 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
23b80 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
23b90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74  (sqlite3 *db, Bt
23ba0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
23bb0 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
23bc0 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
23bd0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
23be0 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
23bf0 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
23c00 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
23c10 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
23c20 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
23c30 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
23c40 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
23c50 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
23c60 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
23c70 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73  ..  /* Get the s
23c80 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
23c90 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e   entry.  Only in
23ca0 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66  dices entries of
23cb0 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
23cc0 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74  2GiB are support
23cd0 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67   - anything larg
23ce0 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61  e must be databa
23cf0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
23d00 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69   ** Any corrupti
23d10 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69  on is detected i
23d20 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n sqlite3BtreePa
23d30 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68  rseCellPtr(), th
23d40 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68  ough, so.  ** th
23d50 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65  is code can safe
23d60 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e  ly assume that n
23d70 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69  CellKey is 32-bi
23d80 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts  .  */.  asse
23d90 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
23da0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
23db0 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65  ur) );.  nCellKe
23dc0 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  y = sqlite3Btree
23dd0 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72  PayloadSize(pCur
23de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  );.  assert( (nC
23df0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
23e00 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
23e10 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
23e20 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
23e30 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
23e40 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
23e50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
23e60 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
23e70 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
23e80 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
23e90 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
23ea0 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b  2)nCellKey, &m);
23eb0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
23ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
23ed0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
23ee0 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
23ef0 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
23f00 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
23f10 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
23f20 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
23f30 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
23f40 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
23f50 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
23f60 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
23f70 3e 30 78 37 66 66 66 66 66 66 66 20 29 3b 0a 20  >0x7fffffff );. 
23f80 20 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d 30 20   assert( m.n>=0 
23f90 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
23fa0 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73 7a 48  y(szHdr<3 || szH
23fb0 64 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d 2e 6e  dr>(unsigned)m.n
23fc0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
23fd0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
23fe0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
23ff0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
24000 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
24010 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
24020 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
24030 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
24040 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
24050 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
24060 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
24070 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
24080 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
24090 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
240a0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
240b0 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
240c0 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
240d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
240e0 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
240f0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
24100 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
24110 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
24120 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
24130 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
24140 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
24150 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
24160 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
24170 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
24180 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
24190 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
241a0 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
241b0 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
241c0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
241d0 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
241e0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d  owid = sqlite3Sm
241f0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70  allTypeSizes[typ
24200 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63  eRowid];.  testc
24210 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
24220 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
24230 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
24240 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
24250 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
24260 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
24270 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
24280 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
24290 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
242a0 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
242b0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
242c0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
242d0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
242e0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
242f0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
24300 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
24310 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
24320 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
24330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
24340 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
24350 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
24360 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
24370 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
24380 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
24390 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
243a0 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
243b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
243c0 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
243d0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
243e0 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
243f0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
24400 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
24410 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
24420 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24430 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
24440 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
24450 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
24460 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
24470 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
24480 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
24490 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
244a0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
244b0 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
244c0 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
244d0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
244e0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
244f0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
24500 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
24510 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
24520 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24530 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
24540 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
24550 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
24560 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
24570 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
24580 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
24590 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
245a0 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
245b0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
245c0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
245d0 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
245e0 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
245f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
24600 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
24610 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
24620 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
24630 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
24640 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
24650 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
24660 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
24670 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
24680 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
24690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
246a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
246b0 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
246c0 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
246d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
246e0 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
246f0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
24700 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
24710 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
24720 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
24730 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
24740 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
24770 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
24780 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
24790 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
247a0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
247b0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d  sor *pCur;.  Mem
247c0 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   m;..  assert( p
247d0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
247e0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
247f0 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  pCur = pC->uc.pC
24800 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
24810 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24820 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
24830 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
24840 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
24850 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
24860 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
24870 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
24880 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
24890 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
248a0 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
248b0 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
248c0 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
248d0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
248e0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
248f0 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
24900 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
24910 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
24920 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
24930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24940 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24950 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
24960 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
24970 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24980 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
24990 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
249a0 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20  CellKey, &m);.  
249b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
249c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
249d0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
249e0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
249f0 74 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c  thSkip(m.n, m.z,
24a00 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a   pUnpacked, 0);.
24a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
24a20 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
24a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
24a50 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
24a60 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
24a70 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
24a80 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
24a90 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
24aa0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24ab0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
24ac0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
24ad0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
24ae0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
24af0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
24b00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
24b10 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
24b20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
24b30 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
24b40 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
24b50 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
24b60 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
24b70 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
24b80 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
24b90 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
24ba0 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
24bb0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
24bc0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
24bd0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
24be0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
24bf0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
24c00 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
24c10 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
24c20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
24c30 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
24c40 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
24c50 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
24c60 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
24c70 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
24c80 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
24c90 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
24ca0 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
24cb0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
24cc0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
24cd0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
24ce0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
24cf0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
24d00 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
24d10 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
24d20 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
24d30 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
24d40 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
24d50 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
24d60 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
24d70 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
24d80 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
24d90 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a  ts obsolete..**.
24da0 2a 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20 31  ** If iCode is 1
24db0 2c 20 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f  , then expiratio
24dc0 6e 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  n is advisory.  
24dd0 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68  The statement sh
24de0 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65  ould.** be repre
24df0 70 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  pared before bei
24e00 6e 67 20 72 65 73 74 61 72 74 65 64 2c 20 62 75  ng restarted, bu
24e10 74 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  t if it is alrea
24e20 64 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74  dy running.** it
24e30 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72   is allowed to r
24e40 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
24e50 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c  ..**.** Internal
24e60 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
24e70 6e 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  n just sets the 
24e80 56 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61  Vdbe.expired fla
24e90 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70  g on all.** prep
24ea0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  ared statements.
24eb0 20 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65    The flag is se
24ec0 74 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d  t to 1 for an im
24ed0 6d 65 64 69 61 74 65 20 65 78 70 69 72 61 74 69  mediate expirati
24ee0 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f  on.** and set to
24ef0 20 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f   2 for an adviso
24f00 72 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a  ry expiration..*
24f10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24f20 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
24f30 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
24f40 64 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a  db, int iCode){.
24f50 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
24f60 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
24f70 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
24f80 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
24f90 20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a   iCode+1;.  }.}.
24fa0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24fb0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
24fc0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
24fd0 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
24fe0 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
24ff0 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
25000 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
25010 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c  * Return the SQL
25020 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67  ITE_PREPARE flag
25030 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f  s for a Vdbe..*/
25040 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50  .u8 sqlite3VdbeP
25050 72 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65  repareFlags(Vdbe
25060 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
25070 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a  ->prepFlags;.}..
25080 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
25090 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
250a0 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
250b0 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
250c0 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
250d0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
250e0 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
250f0 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
25100 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
25110 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
25120 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
25130 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
25140 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
25150 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
25160 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
25170 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
25180 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25190 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
251a0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
251b0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
251c0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
251d0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
251e0 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
251f0 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
25200 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
25210 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
25220 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
25230 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
25240 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
25250 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
25260 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
25270 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
25280 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25290 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
252a0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
252b0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
252c0 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
252d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
252e0 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
252f0 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
25300 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
25310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25320 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
25330 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
25340 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
25350 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
25360 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
25370 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
25380 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
25390 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
253a0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
253b0 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
253c0 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
253d0 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
253e0 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
253f0 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
25400 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
25410 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
25420 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
25430 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
25440 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
25450 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
25460 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
25470 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
25480 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
25490 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
254a0 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d   assert( (v->db-
254b0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
254c0 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29  EnableQPSG)==0 )
254d0 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32  ;.  if( iVar>=32
254e0 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
254f0 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30  sk |= 0x80000000
25500 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
25510 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75  ->expmask |= ((u
25520 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29  32)1 << (iVar-1)
25530 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
25540 43 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e  Cause a function
25550 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72   to throw an err
25560 6f 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c  or if it was cal
25570 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75  l from OP_PureFu
25580 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  nc.** rather tha
25590 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a  n OP_Function..*
255a0 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63  *.** OP_PureFunc
255b0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
255c0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
255d0 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20   deterministic, 
255e0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68  and should.** th
255f0 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
25600 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75  it is given inpu
25610 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  ts that would ma
25620 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d  ke it non-determ
25630 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73  inistic..** This
25640 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
25650 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65  ked by date/time
25660 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
25670 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  use non-determin
25680 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65  istic.** feature
25690 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e  s such as 'now'.
256a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  .*/.int sqlite3N
256b0 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74  otPureFunc(sqlit
256c0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
256d0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
256e0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
256f0 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70 43 74  _STAT4.  if( pCt
25700 78 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 65  x->pVdbe==0 ) re
25710 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20  turn 1;.#endif. 
25720 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65   if( pCtx->pVdbe
25730 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d  ->aOp[pCtx->iOp]
25740 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65  .opcode==OP_Pure
25750 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  Func ){.    sqli
25760 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
25770 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 22  (pCtx, .       "
25780 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
25790 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e  c function in in
257a0 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  dex expression o
257b0 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  r CHECK constrai
257c0 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b  nt",.       -1);
257d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
257e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
257f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25800 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
25810 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  LE./*.** Transfe
25820 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  r error message 
25830 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c  text from an sql
25840 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73  ite3_vtab.zErrMs
25850 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
25860 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
25870 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
25880 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61  3_malloc) into a
25890 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74   Vdbe.zErrMsg (t
258a0 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
258b0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
258c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
258d0 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20  alloc)..*/.void 
258e0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
258f0 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c  tErrmsg(Vdbe *p,
25900 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
25910 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74  Vtab){.  if( pVt
25920 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
25930 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
25940 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69   p->db;.    sqli
25950 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
25960 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
25970 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
25980 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
25990 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
259a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
259b0 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
259c0 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45  );.    pVtab->zE
259d0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d  rrMsg = 0;.  }.}
259e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
259f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
25a00 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BLE */..#ifdef S
25a10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
25a20 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a  UPDATE_HOOK../*.
25a30 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
25a40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
25a50 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61   NULL, release a
25a60 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ny allocations a
25a70 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
25a80 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  th the memory ce
25a90 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d  lls in the p->aM
25aa0 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f  em[] array. Also
25ab0 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b   free the Unpack
25ac0 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
25ad0 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73  cture itself, us
25ae0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
25af0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e()..**.** This 
25b00 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
25b10 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65   to free Unpacke
25b20 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
25b30 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
25b40 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63  ** the vdbeUnpac
25b50 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69  kRecord() functi
25b60 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65  on found in vdbe
25b70 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  api.c..*/.static
25b80 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e   void vdbeFreeUn
25b90 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a  packed(sqlite3 *
25ba0 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  db, int nField, 
25bb0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
25bc0 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
25bd0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
25be0 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b  r(i=0; i<nField;
25bf0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d   i++){.      Mem
25c00 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
25c10 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[i];.      if( 
25c20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20  pMem->zMalloc ) 
25c30 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
25c40 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20  lease(pMem);.   
25c50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
25c60 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20  FreeNN(db, p);. 
25c70 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
25c80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
25c90 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a  UPDATE_HOOK */..
25ca0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
25cb0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
25cc0 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  OOK./*.** Invoke
25cd0 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20   the pre-update 
25ce0 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73  hook. If this is
25cf0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
25d00 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20  LETE pre-update 
25d10 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75  call,.** then cu
25d20 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
25d30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
25d40 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20  nt should point 
25d50 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74  to the row about
25d60 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65  .** to be update
25d70 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
25d80 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
25d90 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72  calls sqlite3_pr
25da0 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a  eupdate_old(),.*
25db0 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76  * the required v
25dc0 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61  alue will be rea
25dd0 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74  d from the row t
25de0 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73  he cursor points
25df0 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   to..*/.void sql
25e00 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74  ite3VdbePreUpdat
25e10 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76  eHook(.  Vdbe *v
25e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25e30 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
25e40 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
25e50 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a   is invoked by *
25e60 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
25e70 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
25e80 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
25e90 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75   grab old.* valu
25ea0 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  es from */.  int
25eb0 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ed0 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55  SQLITE_INSERT, U
25ee0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
25ef0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
25f00 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *zDb,           
25f10 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
25f20 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65   name */.  Table
25f30 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
25f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
25f50 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a  dified table */.
25f60 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20    i64 iKey1,    
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79    /* Initial key
25f90 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
25fa0 69 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20  iReg            
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25fc0 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e  egister for new.
25fd0 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  * record */.){. 
25fe0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
25ff0 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79  ->db;.  i64 iKey
26000 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70  2;.  PreUpdate p
26010 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73  reupdate;.  cons
26020 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70  t char *zTbl = p
26030 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74  Tab->zName;.  st
26040 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61  atic const u8 fa
26050 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  keSortOrder = 0;
26060 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
26070 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b  pPreUpdate==0 );
26080 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70  .  memset(&preup
26090 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  date, 0, sizeof(
260a0 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69  PreUpdate));.  i
260b0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
260c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79  )==0 ){.    iKey
260d0 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20  1 = iKey2 = 0;. 
260e0 20 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b     preupdate.pPk
260f0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
26100 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
26110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
26120 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  ( op==SQLITE_UPD
26130 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65  ATE ){.      iKe
26140 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65  y2 = v->aMem[iRe
26150 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73  g].u.i;.    }els
26160 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d  e{.      iKey2 =
26170 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20   iKey1;.    }.  
26180 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  }..  assert( pCs
26190 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d  r->nField==pTab-
261a0 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c  >nCol .       ||
261b0 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d   (pCsr->nField==
261c0 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20  pTab->nCol+1 && 
261d0 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  op==SQLITE_DELET
261e0 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20  E && iReg==-1). 
261f0 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65   );..  preupdate
26200 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64  .v = v;.  preupd
26210 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b  ate.pCsr = pCsr;
26220 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20  .  preupdate.op 
26230 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74  = op;.  preupdat
26240 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67  e.iNewReg = iReg
26250 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
26260 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20  yinfo.db = db;. 
26270 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
26280 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  fo.enc = ENC(db)
26290 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
262a0 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20  yinfo.nKeyField 
262b0 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
262c0 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
262d0 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  o.aSortOrder = (
262e0 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64  u8*)&fakeSortOrd
262f0 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  er;.  preupdate.
26300 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey1 = iKey1;. 
26310 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32   preupdate.iKey2
26320 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75   = iKey2;.  preu
26330 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54 61  pdate.pTab = pTa
26340 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  b;..  db->pPreUp
26350 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74  date = &preupdat
26360 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64  e;.  db->xPreUpd
26370 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ateCallback(db->
26380 70 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64  pPreUpdateArg, d
26390 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c  b, op, zDb, zTbl
263a0 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b  , iKey1, iKey2);
263b0 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
263c0 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
263d0 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70  DbFree(db, preup
263e0 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20  date.aRecord);. 
263f0 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
26400 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
26410 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
26420 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70  d+1, preupdate.p
26430 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62  Unpacked);.  vdb
26440 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62  eFreeUnpacked(db
26450 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69  , preupdate.keyi
26460 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c  nfo.nKeyField+1,
26470 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55   preupdate.pNewU
26480 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20  npacked);.  if( 
26490 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29  preupdate.aNew )
264a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
264b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
264c0 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  ->nField; i++){.
264d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
264e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65  eMemRelease(&pre
264f0 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b  update.aNew[i]);
26500 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
26510 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
26520 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a  reupdate.aNew);.
26530 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
26540 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
26550 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.