/ Hex Artifact Content
Login

Artifact d17dfbf1e03ef706cad9e2076c7f2354882c191a84e73e00c69c50bb7823e5ce:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1180: 4e 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c  New = (v->nOpAll
1190: 6f 63 3e 3d 35 31 32 20 3f 20 32 2a 28 73 71 6c  oc>=512 ? 2*(sql
11a0: 69 74 65 33 5f 69 6e 74 36 34 29 76 2d 3e 6e 4f  ite3_int64)v->nO
11b0: 70 41 6c 6c 6f 63 0a 20 20 20 20 20 20 20 20 20  pAlloc.         
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
11d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
11e0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
1200: 33 5f 69 6e 74 36 34 20 6e 4e 65 77 20 3d 20 28  3_int64 nNew = (
1210: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 32 2a  v->nOpAlloc ? 2*
1220: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76  (sqlite3_int64)v
1230: 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20 20 20 20 20  ->nOpAlloc.     
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e     : (sqlite3_in
1260: 74 36 34 29 28 31 30 32 34 2f 73 69 7a 65 6f 66  t64)(1024/sizeof
1270: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44  (Op)));.  UNUSED
1280: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b  _PARAMETER(nOp);
1290: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
12a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69  sure that the si
12b0: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65  ze of a VDBE doe
12c0: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c  s not grow too l
12d0: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e  arge */.  if( nN
12e0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d  ew > p->db->aLim
12f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1300: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20  VDBE_OP] ){.    
1310: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1320: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  p->db);.    retu
1330: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1340: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1350: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
1360: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
1370: 72 74 28 20 6e 4e 65 77 3e 3d 28 76 2d 3e 6e 4f  rt( nNew>=(v->nO
1380: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
1390: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
13a0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
13b0: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
13c0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
13d0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73  pNew ){.    p->s
13e0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  zOpAlloc = sqlit
13f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1400: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ->db, pNew);.   
1410: 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70   v->nOpAlloc = p
1420: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65  ->szOpAlloc/size
1430: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61  of(Op);.    v->a
1440: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
1450: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
1460: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1470: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1480: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1490: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
14a0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
14b0: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
14c0: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
14d0: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
14e0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
14f0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
1500: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
1510: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
1520: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
1530: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
1540: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
1550: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
1560: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1570: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1580: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1590: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
15a0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
15b0: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
15c0: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
15d0: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
15e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
15f0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1600: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1610: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1620: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1630: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1640: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
1650: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
1660: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
1670: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1680: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1690: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
16a0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
16d0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
16e0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
16f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1700: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1710: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1720: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1730: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1740: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1750: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
1760: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1770: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
1780: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
1790: 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  ( p->nOpAlloc<=p
17a0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
17b0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
17c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
17d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
17e0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
17f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1800: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1810: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1830: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
1840: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1850: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
1860: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
1870: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
1880: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
1890: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
18a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
18b0: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f  sert( op>=0 && o
18c0: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
18d0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
18e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
18f0: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1900: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1910: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1920: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1930: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1940: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1950: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1960: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1970: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1980: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1990: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
19a0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
19b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19c0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
19d0: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
19e0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
19f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1a00: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1a10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a20: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a30: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a40: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1a50: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1a60: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1a70: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1a80: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1a90: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1aa0: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1ab0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1ac0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1ad0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
1ae0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
1af0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1b00: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1b30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1b40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1b50: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1b60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1b70: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1b80: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1b90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1bb0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1bc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1bd0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1be0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1bf0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c10: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1c20: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
1c30: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1c40: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1c50: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1c60: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1c70: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1c80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1c90: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cb0: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
1cc0: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
1cd0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ce0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
1cf0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
1d00: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
1d10: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
1d20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
1d30: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1d40: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1d50: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1d60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d70: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1d80: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1d90: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1db0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
1dc0: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
1dd0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
1de0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
1df0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
1e00: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
1e10: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
1e20: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
1e30: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1e40: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1e50: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1e60: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1e70: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1e80: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1e90: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1ea0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1eb0: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1ec0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1ed0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
1ee0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
1ef0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
1f00: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
1f10: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
1f20: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
1f30: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
1f40: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
1f50: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
1f60: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
1f70: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  ng does not end 
1f80: 77 69 74 68 20 22 58 22 20 74 68 65 6e 20 61 6e  with "X" then an
1f90: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 69 6e   OP_ResultRow in
1fa0: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  struction.** is 
1fb0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1fc0: 65 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65  e values inserte
1fd0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1fe0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
2000: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
2010: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
2020: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2030: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
2040: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
2050: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
2060: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
2070: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
2080: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
2090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20a0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
20b0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
20c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20d0: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
20e0: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
20f0: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 69 2c  ng8, 0, iDest+i,
2100: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
2110: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 69 27 20  else if( c=='i' 
2120: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2130: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
2140: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
2150: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
2160: 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +i);.    }else{.
2170: 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2180: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b 0a 20 20  op_resultrow;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
21a0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f  3VdbeAddOp2(p, O
21b0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 44 65  P_ResultRow, iDe
21c0: 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f 6f 70 5f  st, i);.skip_op_
21d0: 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20 76 61 5f  resultrow:.  va_
21e0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
21f0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2200: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2210: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
2220: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2240: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2260: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2270: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2280: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2290: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
22b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22c0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
22d0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
22e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
22f0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2300: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2310: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2320: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2330: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
2340: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
2350: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
2360: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
2370: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
2380: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2390: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
23a0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
23b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
23c0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
23d0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
23e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
23f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2400: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2410: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
2420: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
2430: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
2440: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
2450: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2460: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2470: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2480: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2490: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24b0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
24c0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
24d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24e0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
24f0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2500: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2510: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2520: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2530: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2540: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2550: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2560: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2570: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2580: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2590: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
25a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
25b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
25c0: 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44  wNN(sqlite3VdbeD
25d0: 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(p), 8);.  if( 
25e0: 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28  p4copy ) memcpy(
25f0: 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b  p4copy, zP4, 8);
2600: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2610: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f  3VdbeAddOp4(p, o
2620: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70  p, p1, p2, p3, p
2630: 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a  4copy, p4type);.
2640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2650: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
2660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2670: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63  address of the c
2680: 75 72 72 65 6e 74 20 45 58 50 4c 41 49 4e 20 51  urrent EXPLAIN Q
2690: 55 45 52 59 20 50 4c 41 4e 20 62 61 73 65 6c 69  UERY PLAN baseli
26a0: 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 22  ne..** 0 means "
26b0: 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  none"..*/.int sq
26c0: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
26d0: 50 61 72 65 6e 74 28 50 61 72 73 65 20 2a 70 50  Parent(Parse *pP
26e0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 4f 70 20  arse){.  VdbeOp 
26f0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 50 61 72  *pOp;.  if( pPar
2700: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 3d  se->addrExplain=
2710: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2720: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2730: 62 65 47 65 74 4f 70 28 70 50 61 72 73 65 2d 3e  beGetOp(pParse->
2740: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 61  pVdbe, pParse->a
2750: 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 72  ddrExplain);.  r
2760: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 7d  eturn pOp->p2;.}
2770: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 64 65  ../*.** Set a de
2780: 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
2790: 74 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t on the followi
27a0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  ng routine in or
27b0: 64 65 72 20 74 6f 0a 2a 2a 20 6d 6f 6e 69 74 6f  der to.** monito
27c0: 72 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  r the EXPLAIN QU
27d0: 45 52 59 20 50 4c 41 4e 20 63 6f 64 65 20 67 65  ERY PLAN code ge
27e0: 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  neration..*/.#if
27f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2800: 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69  DEBUG).void sqli
2810: 74 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70  te3ExplainBreakp
2820: 6f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  oint(const char 
2830: 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *z1, const char 
2840: 2a 7a 32 29 7b 0a 20 20 28 76 6f 69 64 29 7a 31  *z2){.  (void)z1
2850: 3b 0a 20 20 28 76 6f 69 64 29 7a 32 3b 0a 7d 0a  ;.  (void)z2;.}.
2860: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
2870: 64 20 61 20 6e 65 77 20 4f 50 5f 20 6f 70 63 6f  d a new OP_ opco
2880: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  de..**.** If the
2890: 20 62 50 75 73 68 20 66 6c 61 67 20 69 73 20 74   bPush flag is t
28a0: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  rue, then make t
28b0: 68 69 73 20 6f 70 63 6f 64 65 20 74 68 65 20 70  his opcode the p
28c0: 61 72 65 6e 74 20 66 6f 72 0a 2a 2a 20 73 75 62  arent for.** sub
28d0: 73 65 71 75 65 6e 74 20 45 78 70 6c 61 69 6e 73  sequent Explains
28e0: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 56 64   until sqlite3Vd
28f0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 29 20 69  beExplainPop() i
2900: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69  s called..*/.voi
2910: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  d sqlite3VdbeExp
2920: 6c 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lain(Parse *pPar
2930: 73 65 2c 20 75 38 20 62 50 75 73 68 2c 20 63 6f  se, u8 bPush, co
2940: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2950: 2e 2e 2e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ...){.#ifndef SQ
2960: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
2970: 41 6c 77 61 79 73 20 69 6e 63 6c 75 64 65 20 74  Always include t
2980: 68 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  he OP_Explain op
2990: 63 6f 64 65 73 20 69 66 20 53 51 4c 49 54 45 5f  codes if SQLITE_
29a0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
29b0: 2e 0a 20 20 2a 2a 20 42 75 74 20 6f 6d 69 74 20  ..  ** But omit 
29c0: 74 68 65 6d 20 28 66 6f 72 20 70 65 72 66 6f 72  them (for perfor
29d0: 6d 61 6e 63 65 29 20 64 75 72 69 6e 67 20 70 72  mance) during pr
29e0: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 20  oduction builds 
29f0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
2a00: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
2a10: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 63 68 61  ndif.  {.    cha
2a20: 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62  r *zMsg;.    Vdb
2a30: 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73  e *v;.    va_lis
2a40: 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 69 54  t ap;.    int iT
2a50: 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  his;.    va_star
2a60: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
2a70: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 56   zMsg = sqlite3V
2a80: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a90: 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  db, zFmt, ap);. 
2aa0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
2ab0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
2ac0: 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 73 20  Vdbe;.    iThis 
2ad0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71  = v->nOp;.    sq
2ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2af0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
2b00: 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e 61 64  This, pParse->ad
2b10: 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20  drExplain, 0,.  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e      zMsg, P4_DYN
2b40: 41 4d 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  AMIC);.    sqlit
2b50: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2b60: 69 6e 74 28 62 50 75 73 68 3f 22 50 55 53 48 22  int(bPush?"PUSH"
2b70: 3a 22 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  :"", sqlite3Vdbe
2b80: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 70 34 2e  GetOp(v,-1)->p4.
2b90: 7a 29 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73  z);.    if( bPus
2ba0: 68 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  h){.      pParse
2bb0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
2bc0: 69 54 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  iThis;.    }.  }
2bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68  .}../*.** Pop th
2be0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
2bf0: 50 4c 41 4e 20 73 74 61 63 6b 20 6f 6e 65 20 6c  PLAN stack one l
2c00: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
2c10: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
2c20: 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
2c30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e){.  sqlite3Exp
2c40: 6c 61 69 6e 42 72 65 61 6b 70 6f 69 6e 74 28 22  lainBreakpoint("
2c50: 50 4f 50 22 2c 20 30 29 3b 0a 20 20 70 50 61 72  POP", 0);.  pPar
2c60: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20  se->addrExplain 
2c70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
2c80: 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 72 73  lainParent(pPars
2c90: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
2ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2cb0: 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  AIN */../*.** Ad
2cc0: 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68  d an OP_ParseSch
2cd0: 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ema opcode.  Thi
2ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f  s routine is bro
2cf0: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  ken out from.** 
2d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d10: 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65  4() since it nee
2d20: 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73  ds to also needs
2d30: 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72   to mark all btr
2d40: 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67  ees.** as having
2d50: 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a   been used..**.*
2d60: 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72  * The zWhere str
2d70: 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  ing must have be
2d80: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2d90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2da0: 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  )..** This routi
2db0: 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e  ne will take own
2dc0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c  ership of the al
2dd0: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a  located memory..
2de0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2df0: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
2e00: 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  aOp(Vdbe *p, int
2e10: 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65   iDb, char *zWhe
2e20: 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  re){.  int j;.  
2e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e40: 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(p, OP_ParseSch
2e50: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ema, iDb, 0, 0, 
2e60: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
2e70: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
2e80: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
2e90: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
2ea0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
2ec0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
2ed0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
2ee0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
2ef0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2f00: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
2f10: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
2f20: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
2f30: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
2f40: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f60: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2f70: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2f80: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2f90: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2fa0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2fb0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fe0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2ff0: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
3000: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
3010: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
3020: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
3030: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3040: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
3050: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
3060: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
3070: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
3080: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3090: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
30a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
30b0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70   P4_INT32;.    p
30c0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20  Op->p4.i = p4;. 
30d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
30e0: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74  ;.}../* Insert t
30f0: 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72  he end of a co-r
3100: 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73  outine.*/.void s
3110: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
3120: 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20  outine(Vdbe *v, 
3130: 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20  int regYield){. 
3140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3150: 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
3160: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
3170: 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68  ;..  /* Clear th
3180: 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  e temporary regi
3190: 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72  ster cache, ther
31a0: 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61  eby ensuring tha
31b0: 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72  t each.  ** co-r
31c0: 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f  outine has its o
31d0: 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  wn independent s
31e0: 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c  et of registers,
31f0: 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74   because co-rout
3200: 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20  ines.  ** might 
3210: 65 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67  expect their reg
3220: 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65  isters to be pre
3230: 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e  served across an
3240: 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20   OP_Yield, and. 
3250: 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63   ** that could c
3260: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66  ause problems if
3270: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d   two or more co-
3280: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69  routines are usi
3290: 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  ng the same.  **
32a0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
32b0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70  ter..  */.  v->p
32c0: 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
32d0: 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65  = 0;.  v->pParse
32e0: 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
32f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3300: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
3310: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
3320: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
3330: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
3340: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
3350: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
3360: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
3370: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
3380: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
3390: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
33a0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
33b0: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
33c0: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
33d0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
33e0: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
33f0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
3400: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
3410: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
3420: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
3430: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
3440: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
3450: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
3460: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
3470: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
3480: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
3490: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
34a0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
34b0: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
34c0: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
34d0: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
34e0: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
34f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
3500: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
3510: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
3520: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
3530: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
3540: 2a 20 28 4c 61 74 65 72 3a 29 20 54 68 69 73 20  * (Later:) This 
3550: 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72  is only true for
3560: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 68 61   opcodes that ha
3570: 76 65 20 74 68 65 20 4f 50 46 4c 47 5f 4a 55 4d  ve the OPFLG_JUM
3580: 50 0a 2a 2a 20 70 72 6f 70 65 72 74 79 2e 0a 2a  P.** property..*
3590: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 75 73  *.** Variable us
35a0: 61 67 65 20 6e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a  age notes:.**.**
35b0: 20 20 20 20 20 50 61 72 73 65 2e 61 4c 61 62 65       Parse.aLabe
35c0: 6c 5b 78 5d 20 20 20 20 20 53 74 6f 72 65 73 20  l[x]     Stores 
35d0: 74 68 65 20 61 64 64 72 65 73 73 20 74 68 61 74  the address that
35e0: 20 74 68 65 20 78 2d 74 68 20 6c 61 62 65 6c 20   the x-th label 
35f0: 72 65 73 6f 6c 76 65 73 0a 2a 2a 20 20 20 20 20  resolves.**     
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 69 6e 74 6f 2e 20 20 46 6f 72 20 74      into.  For t
3620: 65 73 74 69 6e 67 20 28 53 51 4c 49 54 45 5f 44  esting (SQLITE_D
3630: 45 42 55 47 29 2c 20 75 6e 72 65 73 6f 6c 76 65  EBUG), unresolve
3640: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 62               lab
3660: 65 6c 73 20 73 74 6f 72 65 73 20 2d 31 2c 20 62  els stores -1, b
3670: 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 72  ut that is not r
3680: 65 71 75 69 72 65 64 2e 0a 2a 2a 20 20 20 20 20  equired..**     
3690: 50 61 72 73 65 2e 6e 4c 61 62 65 6c 41 6c 6c 6f  Parse.nLabelAllo
36a0: 63 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c  c   Number of sl
36b0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ots allocated to
36c0: 20 50 61 72 73 65 2e 61 4c 61 62 65 6c 5b 5d 0a   Parse.aLabel[].
36d0: 2a 2a 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61  **     Parse.nLa
36e0: 62 65 6c 20 20 20 20 20 20 20 20 54 68 65 20 2a  bel        The *
36f0: 6e 65 67 61 74 69 76 65 2a 20 6f 66 20 74 68 65  negative* of the
3700: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c   number of label
3710: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 62 65 65 6e 20 69 73 73 75         been issu
3740: 65 64 2e 20 20 54 68 65 20 6e 65 67 61 74 69 76  ed.  The negativ
3750: 65 20 69 73 20 73 74 6f 72 65 64 20 62 65 63 61  e is stored beca
3760: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  use.**          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3780: 68 61 74 20 67 69 76 65 73 20 61 20 70 65 72 66  hat gives a perf
3790: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
37a0: 65 6e 74 20 6f 76 65 72 20 73 74 6f 72 69 6e 67  ent over storing
37b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
37d0: 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69 74  equivalent posit
37e0: 69 76 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e  ive value..*/.in
37f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
3800: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 50  eLabel(Parse *pP
3810: 61 72 73 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  arse){.  return 
3820: 2d 2d 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  --pParse->nLabel
3830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
3840: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
3850: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
3860: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3870: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
3880: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
3890: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
38a0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
38b0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
38c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
38d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
38e0: 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  l()..*/.static S
38f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
3900: 6f 69 64 20 72 65 73 69 7a 65 52 65 73 6f 6c 76  oid resizeResolv
3910: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 2c  eLabel(Parse *p,
3920: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6a 29   Vdbe *v, int j)
3930: 7b 0a 20 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  {.  int nNewSize
3940: 20 3d 20 31 30 20 2d 20 70 2d 3e 6e 4c 61 62 65   = 10 - p->nLabe
3950: 6c 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  l;.  p->aLabel =
3960: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
3970: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
3980: 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20  ->aLabel,.      
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
39a0: 4e 65 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70  NewSize*sizeof(p
39b0: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20  ->aLabel[0]));. 
39c0: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d   if( p->aLabel==
39d0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  0 ){.    p->nLab
39e0: 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  elAlloc = 0;.  }
39f0: 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
3a00: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 6e  ITE_DEBUG.    in
3a10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
3a20: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20 69  ->nLabelAlloc; i
3a30: 3c 6e 4e 65 77 53 69 7a 65 3b 20 69 2b 2b 29 20  <nNewSize; i++) 
3a40: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
3a50: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  1;.#endif.    p-
3a60: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 6e  >nLabelAlloc = n
3a70: 4e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 2d 3e  NewSize;.    p->
3a80: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3a90: 4f 70 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  Op;.  }.}.void s
3aa0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
3ab0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
3ac0: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
3ad0: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
3ae0: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
3af0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
3b00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3b10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3b20: 72 74 28 20 6a 3c 2d 70 2d 3e 6e 4c 61 62 65 6c  rt( j<-p->nLabel
3b30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
3b40: 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
3b50: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
3b60: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
3b70: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
3b80: 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
3b90: 74 66 28 22 52 45 53 4f 4c 56 45 20 4c 41 42 45  tf("RESOLVE LABE
3ba0: 4c 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 78  L %d to %d\n", x
3bb0: 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 7d 0a 23  , v->nOp);.  }.#
3bc0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e  endif.  if( p->n
3bd0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 2b 20 70 2d 3e  LabelAlloc + p->
3be0: 6e 4c 61 62 65 6c 20 3c 20 30 20 29 7b 0a 20 20  nLabel < 0 ){.  
3bf0: 20 20 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c    resizeResolveL
3c00: 61 62 65 6c 28 70 2c 76 2c 6a 29 3b 0a 20 20 7d  abel(p,v,j);.  }
3c10: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
3c20: 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d  ( p->aLabel[j]==
3c30: 28 2d 31 29 20 29 3b 20 2f 2a 20 4c 61 62 65 6c  (-1) ); /* Label
3c40: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
3c50: 73 6f 6c 76 65 64 20 6f 6e 63 65 20 2a 2f 0a 20  solved once */. 
3c60: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20     p->aLabel[j] 
3c70: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a  = v->nOp;.  }.}.
3c80: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3c90: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3ca0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3cb0: 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f   one time..*/.vo
3cc0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  id sqlite3VdbeRu
3cd0: 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a  nOnlyOnce(Vdbe *
3ce0: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
3cf0: 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Once = 1;.}../*.
3d00: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
3d10: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
3d20: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c   only be run mul
3d30: 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a  tiple times..*/.
3d40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3d50: 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70  Reusable(Vdbe *p
3d60: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
3d70: 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64  nce = 0;.}..#ifd
3d80: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
3d90: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
3da0: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
3db0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
3dc0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
3dd0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
3de0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
3df0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3e00: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
3e10: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
3e20: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
3e30: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
3e40: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
3e50: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
3e60: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
3e70: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
3e80: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3e90: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
3ea0: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
3eb0: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
3ec0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
3ed0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
3ee0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
3f10: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
3f20: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
3f30: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3f40: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
3f50: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
3f60: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
3f70: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
3f80: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
3f90: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
3fa0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3fb0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
3fc0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
3fd0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
3fe0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
3ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
4000: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
4010: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
4020: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
4030: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
4040: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4050: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
4060: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4080: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4090: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
40a0: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
40b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
40c0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
40d0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
40e0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
40f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4100: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
4110: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
4120: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
4130: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
4140: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
4150: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
4160: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
4170: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
4180: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
4190: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
41a0: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
41b0: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
41c0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
41d0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
41e0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
41f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4200: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
4210: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
4220: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
4230: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
4240: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
4250: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
4260: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
4270: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
4280: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
4290: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
42a0: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
42b0: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
42c0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
42d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
42e0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
42f0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
4300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
4310: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
4320: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
4330: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
4340: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
4350: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
4360: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4370: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
4380: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
4390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
43a0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
43b0: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
43c0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
43d0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
43e0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
43f0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
4400: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
4410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
4420: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4440: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
4450: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
4460: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
4470: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4480: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
4490: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
44a0: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
44b0: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
44c0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
44d0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
44e0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
44f0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
4500: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
4510: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
4520: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
4530: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
4540: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
4550: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
4560: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
4570: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
4580: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
4590: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
45a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
45b0: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
45c0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
45d0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
45e0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
45f0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
4600: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
4610: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
4620: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
4630: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
4640: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
4650: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
4660: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
4670: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
4680: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
4690: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
46a0: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
46b0: 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f 49  ateBtree/BTREE_I
46c0: 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e 69  NTKEY and OP_Ini
46d0: 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 20  tCoroutine .**  
46e0: 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45 20      (for CREATE 
46f0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
4700: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
4710: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
4720: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
4730: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
4740: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
4750: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
4760: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
4770: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4780: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
4790: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
47a0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
47b0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
47c0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
47d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
47e0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
47f0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
4800: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
4810: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4820: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
4830: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
4840: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
4850: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
4860: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
4870: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
4880: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
4890: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
48a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
48b0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
48c0: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
48d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
48e0: 43 72 65 61 74 65 49 6e 64 65 78 20 3d 20 30 3b  CreateIndex = 0;
48f0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
4900: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
4910: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
4920: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
4930: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
4940: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
4950: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
4960: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
4970: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
4980: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
4990: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
49a0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
49b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
49c0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
49d0: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
49e0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
49f0: 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d       || opcode==
4a00: 4f 50 5f 56 44 65 73 74 72 6f 79 0a 20 20 20 20  OP_VDestroy.    
4a10: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
4a20: 50 61 72 73 65 53 63 68 65 6d 61 20 26 26 20 70  ParseSchema && p
4a30: 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 29 0a 20 20 20  Op->p4.z==0).   
4a40: 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f    || ((opcode==O
4a50: 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65  P_Halt || opcode
4a60: 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29  ==OP_HaltIfNull)
4a70: 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70   .      && ((pOp
4a80: 2d 3e 70 31 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ->p1)!=SQLITE_OK
4a90: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
4aa0: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
4ab0: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
4ac0: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
4ad0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
4ae0: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42  code==OP_CreateB
4af0: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d  tree && pOp->p3=
4b00: 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20  =BTREE_INTKEY ) 
4b10: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
4b20: 20 31 3b 0a 20 20 20 20 69 66 28 20 6d 61 79 41   1;.    if( mayA
4b30: 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  bort ){.      /*
4b40: 20 68 61 73 43 72 65 61 74 65 49 6e 64 65 78 20   hasCreateIndex 
4b50: 6d 61 79 20 61 6c 73 6f 20 62 65 20 73 65 74 20  may also be set 
4b60: 66 6f 72 20 73 6f 6d 65 20 44 45 4c 45 54 45 20  for some DELETE 
4b70: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
4b80: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f  use.      ** OP_
4b90: 43 6c 65 61 72 2e 20 53 6f 20 74 68 69 73 20 72  Clear. So this r
4ba0: 6f 75 74 69 6e 65 20 6d 61 79 20 65 6e 64 20 75  outine may end u
4bb0: 70 20 72 65 74 75 72 6e 69 6e 67 20 74 72 75 65  p returning true
4bc0: 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
4bd0: 20 20 20 20 2a 2a 20 77 68 65 72 65 20 61 20 22      ** where a "
4be0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 22  DELETE FROM tbl"
4bf0: 20 68 61 73 20 61 20 73 74 61 74 65 6d 65 6e 74   has a statement
4c00: 2d 6a 6f 75 72 6e 61 6c 20 62 75 74 20 64 6f 65  -journal but doe
4c10: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72  s not.      ** r
4c20: 65 71 75 69 72 65 20 6f 6e 65 2e 20 54 68 69 73  equire one. This
4c30: 20 69 73 20 6e 6f 74 20 73 6f 20 62 61 64 20 2d   is not so bad -
4c40: 20 69 74 20 69 73 20 61 6e 20 69 6e 65 66 66 69   it is an ineffi
4c50: 63 69 65 6e 63 79 2c 20 6e 6f 74 20 61 20 62 75  ciency, not a bu
4c60: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  g. */.      if( 
4c70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74  opcode==OP_Creat
4c80: 65 42 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70  eBtree && pOp->p
4c90: 33 3d 3d 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  3==BTREE_BLOBKEY
4ca0: 20 29 20 68 61 73 43 72 65 61 74 65 49 6e 64 65   ) hasCreateInde
4cb0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  x = 1;.      if(
4cc0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6c 65 61   opcode==OP_Clea
4cd0: 72 20 29 20 68 61 73 43 72 65 61 74 65 49 6e 64  r ) hasCreateInd
4ce0: 65 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ex = 1;.    }.  
4cf0: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
4d00: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29  _InitCoroutine )
4d10: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
4d20: 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  e = 1;.#ifndef S
4d30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
4d40: 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f  GN_KEY.    if( o
4d50: 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e  pcode==OP_FkCoun
4d60: 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d  ter && pOp->p1==
4d70: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 && pOp->p2==1 
4d80: 29 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f  ){.      hasFkCo
4d90: 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  unter = 1;.    }
4da0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
4db0: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
4dc0: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
4dd0: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
4de0: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
4df0: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
4e00: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
4e10: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
4e20: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
4e30: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
4e40: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
4e50: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
4e60: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
4e70: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
4e80: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
4e90: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
4ea0: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
4eb0: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
4ec0: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
4ed0: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
4ee0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
4ef0: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
4f00: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
4f10: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
4f20: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
4f30: 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73  =mayAbort || has
4f40: 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  FkCounter.      
4f50: 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54    || (hasCreateT
4f60: 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43  able && hasInitC
4f70: 6f 72 6f 75 74 69 6e 65 29 20 7c 7c 20 68 61 73  oroutine) || has
4f80: 43 72 65 61 74 65 49 6e 64 65 78 0a 20 20 29 3b  CreateIndex.  );
4f90: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
4fa0: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
4fb0: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
4fc0: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
4fd0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
4fe0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49  TE_DEBUG./*.** I
4ff0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 57 72  ncrement the nWr
5000: 69 74 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74  ite counter in t
5010: 68 65 20 56 44 42 45 20 69 66 20 74 68 65 20 63  he VDBE if the c
5020: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a  ursor is not an.
5030: 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72  ** ephemeral cur
5040: 73 6f 72 2c 20 6f 72 20 69 66 20 74 68 65 20 63  sor, or if the c
5050: 75 72 73 6f 72 20 61 72 67 75 6d 65 6e 74 20 69  ursor argument i
5060: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20  s NULL..*/.void 
5070: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57  sqlite3VdbeIncrW
5080: 72 69 74 65 43 6f 75 6e 74 65 72 28 56 64 62 65  riteCounter(Vdbe
5090: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
50a0: 2a 70 43 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d  *pC){.  if( pC==
50b0: 30 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75  0.   || (pC->eCu
50c0: 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53  rType!=CURTYPE_S
50d0: 4f 52 54 45 52 0a 20 20 20 20 20 20 20 26 26 20  ORTER.       && 
50e0: 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55  pC->eCurType!=CU
50f0: 52 54 59 50 45 5f 50 53 45 55 44 4f 0a 20 20 20  RTYPE_PSEUDO.   
5100: 20 20 20 20 26 26 20 21 70 43 2d 3e 69 73 45 70      && !pC->isEp
5110: 68 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20  hemeral).  ){.  
5120: 20 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20    p->nWrite++;. 
5130: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
5140: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5150: 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 69 66  ./*.** Assert if
5160: 20 61 6e 20 41 62 6f 72 74 20 61 74 20 74 68 69   an Abort at thi
5170: 73 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  s point in time 
5180: 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
5190: 61 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74  a corrupt.** dat
51a0: 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
51b0: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
51c0: 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a  Abortable(Vdbe *
51d0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
51e0: 3e 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d  >nWrite==0 || p-
51f0: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
5200: 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   );.}.#endif../*
5210: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5220: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
5230: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
5240: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
5250: 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68    It loops.** th
5260: 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70  rough all the op
5270: 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20  codes and fixes 
5280: 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e  up some details.
5290: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65  .**.** (1) For e
52a0: 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63  ach jump instruc
52b0: 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61  tion with a nega
52c0: 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61  tive P2 value (a
52d0: 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72   label).**     r
52e0: 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61  esolve the P2 va
52f0: 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c  lue to an actual
5300: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
5310: 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20  (2) Compute the 
5320: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
5330: 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64  f arguments used
5340: 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63   by any SQL func
5350: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20  tion.**     and 
5360: 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65  store that value
5370: 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67   in *pMaxFuncArg
5380: 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64  s..**.** (3) Upd
5390: 61 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61  ate the Vdbe.rea
53a0: 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62  dOnly and Vdbe.b
53b0: 49 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74  IsReader flags t
53c0: 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20  o accurately.** 
53d0: 20 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61      indicate wha
53e0: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  t the prepared s
53f0: 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c  tatement actuall
5400: 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34  y does..**.** (4
5410: 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  ) Initialize the
5420: 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69   p4.xAdvance poi
5430: 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20  nter on opcodes 
5440: 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a  that use it..**.
5450: 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74  ** (5) Reclaim t
5460: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
5470: 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ted for storing 
5480: 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  labels..**.** Th
5490: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
54a0: 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f  only function co
54b0: 72 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d  rrectly if the m
54c0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e  kopcodeh.tcl gen
54d0: 65 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74  erator.** script
54e0: 20 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63   numbers the opc
54f0: 6f 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20  odes correctly. 
5500: 20 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73   Changes to this
5510: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
5520: 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20  .** coordinated 
5530: 77 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20  with changes to 
5540: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a  mkopcodeh.tcl..*
5550: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
5560: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64  solveP2Values(Vd
5570: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78  be *p, int *pMax
5580: 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74  FuncArgs){.  int
5590: 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61   nMaxArgs = *pMa
55a0: 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20  xFuncArgs;.  Op 
55b0: 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70  *pOp;.  Parse *p
55c0: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
55d0: 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c  e;.  int *aLabel
55e0: 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65   = pParse->aLabe
55f0: 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  l;.  p->readOnly
5600: 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65   = 1;.  p->bIsRe
5610: 61 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20  ader = 0;.  pOp 
5620: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
5630: 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  -1];.  while(1){
5640: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55  ..    /* Only JU
5650: 4d 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74  MP opcodes and t
5660: 68 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66  he short list of
5670: 20 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73   special opcodes
5680: 20 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20   in the switch. 
5690: 20 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64     ** below need
56a0: 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65   to be considere
56b0: 64 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65  d.  The mkopcode
56c0: 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20  h.tcl generator 
56d0: 73 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20  script groups.  
56e0: 20 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f    ** all these o
56f0: 70 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20  pcodes together 
5700: 6e 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f  near the front o
5710: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73  f the opcode lis
5720: 74 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20  t.  Skip.    ** 
5730: 61 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  any opcode that 
5740: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72  does not need pr
5750: 6f 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74  ocessing by virt
5760: 75 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20  ual of the fact 
5770: 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69  that.    ** it i
5780: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51  s larger than SQ
5790: 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43  LITE_MX_JUMP_OPC
57a0: 4f 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72  ODE, as a perfor
57b0: 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  mance optimizati
57c0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
57d0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d  f( pOp->opcode<=
57e0: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f  SQLITE_MX_JUMP_O
57f0: 50 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f  PCODE ){.      /
5800: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
5810: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
5820: 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64  deh.tcl when add
5830: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
5840: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66        ** cases f
5850: 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21  rom this switch!
5860: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
5870: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
5880: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5890: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
58a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
58b0: 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65  p->p2!=0 ) p->re
58c0: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
58d0: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
58e0: 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ru */.        }.
58f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
5900: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
5910: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65      case OP_Save
5920: 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20  point: {.       
5930: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
5940: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
5950: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5960: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5970: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  MIT_WAL.        
5980: 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69  case OP_Checkpoi
5990: 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  nt:.#endif.     
59a0: 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75     case OP_Vacuu
59b0: 6d 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  m:.        case 
59c0: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
59d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
59e0: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
59f0: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
5a00: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
5a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5a20: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5a30: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
5a40: 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72    case OP_Sorter
5a50: 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  Next: {.        
5a60: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
5a70: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
5a80: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  eNext;.         
5a90: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5aa0: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
5ab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
5ac0: 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72   generator never
5ad0: 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68   codes any of th
5ae0: 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61  ese opcodes as a
5af0: 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20   jump.          
5b00: 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20  ** to a label.  
5b10: 54 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20  They are always 
5b20: 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20  coded as a jump 
5b30: 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a  backwards to a .
5b40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f            ** kno
5b50: 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  wn address */.  
5b60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5b70: 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  pOp->p2>=0 );.  
5b80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5ba0: 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b   case OP_Prev: {
5bb0: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
5bc0: 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71  p4.xAdvance = sq
5bd0: 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
5be0: 75 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  us;.          pO
5bf0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41  p->p4type = P4_A
5c00: 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20  DVANCE;.        
5c10: 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65    /* The code ge
5c20: 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f  nerator never co
5c30: 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65  des any of these
5c40: 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75   opcodes as a ju
5c50: 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  mp.          ** 
5c60: 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65  to a label.  The
5c70: 79 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64  y are always cod
5c80: 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63  ed as a jump bac
5c90: 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20  kwards to a .   
5ca0: 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20         ** known 
5cb0: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20  address */.     
5cc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5cd0: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20  ->p2>=0 );.     
5ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cf0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
5d00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
5d10: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63  LTABLE.        c
5d20: 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20  ase OP_VUpdate: 
5d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
5d40: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
5d50: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
5d60: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20  p->p2;.         
5d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5d80: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
5d90: 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20  P_VFilter: {.   
5da0: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
5db0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5dc0: 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e  (pOp - p->aOp) >
5dd0: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20  = 3 );.         
5de0: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
5df0: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
5e00: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ger );.         
5e10: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
5e20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
5e30: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
5e40: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
5e50: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
5e60: 75 67 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66  ugh into the def
5e70: 61 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  ault case */.   
5e80: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
5e90: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
5ea0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5eb0: 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20  Op->p2<0 ){.    
5ec0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
5ed0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72  kopcodeh.tcl scr
5ee0: 69 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e  ipt has so arran
5ef0: 67 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20  ged things that 
5f00: 74 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20  the only.       
5f10: 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70       ** non-jump
5f20: 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68   opcodes less th
5f30: 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d  an SQLITE_MX_JUM
5f40: 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61  P_CODE are guara
5f50: 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20  nteed to.       
5f60: 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e       ** have non
5f70: 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73  -negative values
5f80: 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20   for P2. */.    
5f90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5fa0: 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72  (sqlite3OpcodePr
5fb0: 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f  operty[pOp->opco
5fc0: 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  de] & OPFLG_JUMP
5fd0: 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )!=0 );.        
5fe0: 20 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52      assert( ADDR
5ff0: 28 70 4f 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73  (pOp->p2)<-pPars
6000: 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  e->nLabel );.   
6010: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
6020: 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70   = aLabel[ADDR(p
6030: 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20  Op->p2)];.      
6040: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6050: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
6060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
6070: 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  * The mkopcodeh.
6080: 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73  tcl script has s
6090: 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67  o arranged thing
60a0: 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a  s that the only.
60b0: 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d        ** non-jum
60c0: 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74  p opcodes less t
60d0: 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55  han SQLITE_MX_JU
60e0: 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72  MP_CODE are guar
60f0: 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20  anteed to.      
6100: 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61  ** have non-nega
6110: 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20  tive values for 
6120: 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  P2. */.      ass
6130: 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63  ert( (sqlite3Opc
6140: 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d  odeProperty[pOp-
6150: 3e 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a  >opcode]&OPFLG_J
6160: 55 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e  UMP)==0 || pOp->
6170: 70 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20  p2>=0);.    }.  
6180: 20 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f    if( pOp==p->aO
6190: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  p ) break;.    p
61a0: 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Op--;.  }.  sqli
61b0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
61c0: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29   pParse->aLabel)
61d0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  ;.  pParse->aLab
61e0: 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  el = 0;.  pParse
61f0: 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  ->nLabel = 0;.  
6200: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20  *pMaxFuncArgs = 
6210: 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65  nMaxArgs;.  asse
6220: 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
6230: 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c  !=0 || DbMaskAll
6240: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
6250: 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  k) );.}../*.** R
6260: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
6270: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
6280: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
6290: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
62a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
62b0: 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29  entAddr(Vdbe *p)
62c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
62d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
62e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72  _INIT );.  retur
62f0: 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  n p->nOp;.}../*.
6300: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  ** Verify that a
6310: 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65  t least N opcode
6320: 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c   slots are avail
6330: 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75  able in p withou
6340: 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d  t.** having to m
6350: 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73  alloc for more s
6360: 70 61 63 65 20 28 65 78 63 65 70 74 20 77 68 65  pace (except whe
6370: 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  n compiled using
6380: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  .** SQLITE_TEST_
6390: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e  REALLOC_STRESS).
63a0: 20 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65    This interface
63b0: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
63c0: 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65  testing.** to ve
63d0: 72 69 66 79 20 74 68 61 74 20 63 65 72 74 61 69  rify that certai
63e0: 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  n calls to sqlit
63f0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
6400: 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66  ) can never.** f
6410: 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d  ail due to a OOM
6420: 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65   fault and hence
6430: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
6440: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73   value from.** s
6450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
6460: 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79  ist() will alway
6470: 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a  s be non-NULL..*
6480: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
6490: 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21  LITE_DEBUG) && !
64a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
64b0: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
64c0: 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  SS).void sqlite3
64d0: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
64e0: 6f 63 52 65 71 75 69 72 65 64 28 56 64 62 65 20  ocRequired(Vdbe 
64f0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  *p, int N){.  as
6500: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e  sert( p->nOp + N
6510: 20 3c 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20   <= p->nOpAlloc 
6520: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
6530: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
6540: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
6550: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
6560: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
6570: 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75  in.** an OP_Resu
6580: 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61  ltRow opcode. Fa
6590: 69 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69  il an assert() i
65a0: 66 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20  f it does. This 
65b0: 69 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f  is used.** by co
65c0: 64 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74  de in pragma.c t
65d0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
65e0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
65f0: 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70   of certain.** p
6600: 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20  ragmas comports 
6610: 77 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73  with the flags s
6620: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
6630: 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a  mkpragmatab.tcl.
6640: 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69  ** script..*/.#i
6650: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6660: 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  _DEBUG) && !defi
6670: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f  ned(SQLITE_TEST_
6680: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a  REALLOC_STRESS).
6690: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
66a0: 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f  VerifyNoResultRo
66b0: 77 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  w(Vdbe *p){.  in
66c0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
66d0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
66e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
66f0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
6700: 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20  _ResultRow );.  
6710: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
6720: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
6730: 28 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f  (a single OP_Abo
6740: 72 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74  rtable opcode) t
6750: 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69  hat will.** veri
6760: 66 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45  fy that the VDBE
6770: 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66   program can saf
6780: 65 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69  ely call Abort i
6790: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
67a0: 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66   context..*/.#if
67b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
67c0: 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69  DEBUG).void sqli
67d0: 74 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f  te3VdbeVerifyAbo
67e0: 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20  rtable(Vdbe *p, 
67f0: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
6800: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
6810: 41 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56  Abort ) sqlite3V
6820: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
6830: 41 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65  Abortable);.}.#e
6840: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
6850: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6860: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
6870: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
6880: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
6890: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
68a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
68b0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
68c0: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
68d0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
68e0: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
68f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
6900: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
6910: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
6920: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
6930: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
6940: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
6950: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
6960: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
6970: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
6980: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
6990: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
69a0: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
69b0: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
69c0: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
69d0: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
69e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
69f0: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
6a00: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
6a10: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
6a20: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
6a30: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
6a40: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
6a50: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
6a60: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
6a70: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
6a80: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
6a90: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
6aa0: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
6ab0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6ac0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
6ad0: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
6ae0: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
6af0: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
6b00: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
6b10: 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  t( DbMaskAllZero
6b20: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29  (p->btreeMask) )
6b30: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
6b40: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
6b50: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
6b60: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
6b70: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
6b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
6b90: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
6ba0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
6bb0: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
6bc0: 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f    Return a.** po
6bd0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
6be0: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73  st operation ins
6bf0: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e  erted..**.** Non
6c00: 2d 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e  -zero P2 argumen
6c10: 74 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72  ts to jump instr
6c20: 75 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f  uctions are auto
6c30: 6d 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74  matically adjust
6c40: 65 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  ed.** so that th
6c50: 65 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73  e jump target is
6c60: 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65   relative to the
6c70: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
6c80: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64   inserted..*/.Vd
6c90: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
6ca0: 65 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64  eAddOpList(.  Vd
6cb0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
6cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6cd0: 64 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65  d opcodes to the
6ce0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
6cf0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70  ent */.  int nOp
6d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6d10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6d20: 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64  of opcodes to ad
6d30: 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73  d */.  VdbeOpLis
6d40: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20  t const *aOp,   
6d50: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
6d60: 65 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  es to be added *
6d70: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20  /.  int iLineno 
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20   /* Source-file 
6da0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  line number of f
6db0: 69 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29  irst opcode */.)
6dc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
6dd0: 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72  eOp *pOut, *pFir
6de0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
6df0: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
6e00: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
6e10: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
6e20: 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  if( p->nOp + nOp
6e30: 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26   > p->nOpAlloc &
6e40: 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  & growOpArray(p,
6e50: 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74   nOp) ){.    ret
6e60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69  urn 0;.  }.  pFi
6e70: 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d  rst = pOut = &p-
6e80: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20  >aOp[p->nOp];.  
6e90: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20  for(i=0; i<nOp; 
6ea0: 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74  i++, aOp++, pOut
6eb0: 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f  ++){.    pOut->o
6ec0: 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63  pcode = aOp->opc
6ed0: 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  ode;.    pOut->p
6ee0: 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20  1 = aOp->p1;.   
6ef0: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d   pOut->p2 = aOp-
6f00: 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >p2;.    assert(
6f10: 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   aOp->p2>=0 );. 
6f20: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f     if( (sqlite3O
6f30: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f  pcodeProperty[aO
6f40: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
6f50: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61  LG_JUMP)!=0 && a
6f60: 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20  Op->p2>0 ){.    
6f70: 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d    pOut->p2 += p-
6f80: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
6f90: 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e  pOut->p3 = aOp->
6fa0: 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  p3;.    pOut->p4
6fb0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
6fc0: 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  D;.    pOut->p4.
6fd0: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d  p = 0;.    pOut-
6fe0: 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  >p5 = 0;.#ifdef 
6ff0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
7000: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
7010: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
7020: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
7030: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
7040: 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f  _COVERAGE.    pO
7050: 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69  ut->iSrcLine = i
7060: 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a  Lineno+i;.#else.
7070: 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e      (void)iLinen
7080: 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  o;.#endif.#ifdef
7090: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
70a0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
70b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
70c0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
70d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
70e0: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e  rintOp(0, i+p->n
70f0: 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d  Op, &p->aOp[i+p-
7100: 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  >nOp]);.    }.#e
7110: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f  ndif.  }.  p->nO
7120: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75  p += nOp;.  retu
7130: 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69  rn pFirst;.}..#i
7140: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7150: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
7160: 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41  NSTATUS)./*.** A
7170: 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
7180: 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e  he array of coun
7190: 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20  ters managed by 
71a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
71b0: 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f  nstatus()..*/.vo
71c0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63  id sqlite3VdbeSc
71d0: 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65  anStatus(.  Vdbe
71e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7200: 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61  M to add scansta
7210: 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e  tus() to */.  in
7220: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20  t addrExplain,  
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7240: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45   Address of OP_E
7250: 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f  xplain (or 0) */
7260: 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c  .  int addrLoop,
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
7290: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
72a0: 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69   .  int addrVisi
72b0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
72c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
72d0: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63  f rows visited c
72e0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45  ounter */.  LogE
72f0: 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20  st nEst,        
7300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7310: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
7320: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
7330: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7340: 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  zName           
7350: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7360: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65  able or index be
7370: 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29  ing scanned */.)
7380: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
7390: 34 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53  4 nByte = (p->nS
73a0: 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28  can+1) * sizeof(
73b0: 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53  ScanStatus);.  S
73c0: 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b  canStatus *aNew;
73d0: 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53  .  aNew = (ScanS
73e0: 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62  tatus*)sqlite3Db
73f0: 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70  Realloc(p->db, p
7400: 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b  ->aScan, nByte);
7410: 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20  .  if( aNew ){. 
7420: 20 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70     ScanStatus *p
7430: 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e  New = &aNew[p->n
7440: 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65  Scan++];.    pNe
7450: 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d  w->addrExplain =
7460: 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
7470: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70    pNew->addrLoop
7480: 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20   = addrLoop;.   
7490: 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74   pNew->addrVisit
74a0: 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20   = addrVisit;.  
74b0: 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e    pNew->nEst = n
74c0: 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a  Est;.    pNew->z
74d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
74e0: 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e  StrDup(p->db, zN
74f0: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63  ame);.    p->aSc
7500: 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d  an = aNew;.  }.}
7510: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7520: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
7530: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20   of the opcode, 
7540: 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f  or P1, P2, P3, o
7550: 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a  r P5 operands.**
7560: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
7570: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
7580: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7590: 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62  ChangeOpcode(Vdb
75a0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
75b0: 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a  u8 iNewOpcode){.
75c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
75d0: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f  Op(p,addr)->opco
75e0: 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b  de = iNewOpcode;
75f0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
7600: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
7610: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
7620: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
7630: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
7640: 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d  dr)->p1 = val;.}
7650: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7660: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
7670: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
7680: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
7690: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
76a0: 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p2 = val;.}.v
76b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
76c0: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
76d0: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
76e0: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
76f0: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
7700: 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p3 = val;.}.voi
7710: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
7720: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
7730: 31 36 20 70 35 29 7b 0a 20 20 61 73 73 65 72 74  16 p5){.  assert
7740: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
7750: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
7760: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
7770: 70 3e 30 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e  p>0 ) p->aOp[p->
7780: 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a  nOp-1].p5 = p5;.
7790: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
77a0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
77b0: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
77c0: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
77d0: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
77e0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
77f0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
7800: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
7810: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
7820: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
7830: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
7840: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7850: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
7860: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
7870: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
7880: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
7890: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
78a0: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
78b0: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
78c0: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
78d0: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
78e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
78f0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
7900: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
7910: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
7920: 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
7930: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
7940: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
7950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
7960: 72 65 65 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b  reeNN(db, pDef);
7970: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
7980: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
7990: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
79a0: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
79b0: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
79c0: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
79d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
79e0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
79f0: 20 66 72 65 65 50 34 4d 65 6d 28 73 71 6c 69 74   freeP4Mem(sqlit
7a00: 65 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b  e3 *db, Mem *p){
7a10: 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c  .  if( p->szMall
7a20: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
7a30: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
7a40: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
7a50: 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  reeNN(db, p);.}.
7a60: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
7a70: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65  INLINE void free
7a80: 50 34 46 75 6e 63 43 74 78 28 73 71 6c 69 74 65  P4FuncCtx(sqlite
7a90: 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 63  3 *db, sqlite3_c
7aa0: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 66 72  ontext *p){.  fr
7ab0: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
7ac0: 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63  ion(db, p->pFunc
7ad0: 29 3b 0a 20 73 71 6c 69 74 65 33 44 62 46 72 65  );. sqlite3DbFre
7ae0: 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74  eNN(db, p);.}.st
7af0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34  atic void freeP4
7b00: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
7b10: 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a  t p4type, void *
7b20: 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64  p4){.  assert( d
7b30: 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  b );.  switch( p
7b40: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
7b50: 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a  e P4_FUNCCTX: {.
7b60: 20 20 20 20 20 20 66 72 65 65 50 34 46 75 6e 63        freeP4Func
7b70: 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74 65 33  Ctx(db, (sqlite3
7b80: 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20  _context*)p4);. 
7b90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ba0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
7bb0: 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  AL:.    case P4_
7bc0: 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73 65 20  INT64:.    case 
7bd0: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20  P4_DYNAMIC:.    
7be0: 63 61 73 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a  case P4_DYNBLOB:
7bf0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
7c00: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
7c10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7c20: 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61   p4);.      brea
7c30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7c40: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
7c50: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
7c60: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
7c70: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
7c80: 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34  ref((KeyInfo*)p4
7c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7ca0: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
7cb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7cc0: 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65  R_HINTS.    case
7cd0: 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20   P4_EXPR: {.    
7ce0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7cf0: 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70  ete(db, (Expr*)p
7d00: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
7d10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
7d20: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
7d30: 46 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 45  F: {.      freeE
7d40: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
7d50: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
7d60: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
7d70: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7d80: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
7d90: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
7da0: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
7db0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
7dc0: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
7dd0: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d  ue*)p4);.      }
7de0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 72  else{.        fr
7df0: 65 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d  eeP4Mem(db, (Mem
7e00: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  *)p4);.      }. 
7e10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7e20: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  }.    case P4_VT
7e30: 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  AB : {.      if(
7e40: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7e50: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74  d==0 ) sqlite3Vt
7e60: 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65  abUnlock((VTable
7e70: 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72   *)p4);.      br
7e80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
7e90: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
7ea0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
7eb0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
7ec0: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
7ed0: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
7ee0: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
7ef0: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
7f00: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
7f10: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
7f20: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
7f30: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
7f40: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
7f50: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
7f60: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
7f70: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
7f80: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
7f90: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f  .    for(pOp=&aO
7fa0: 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61  p[nOp-1]; pOp>=a
7fb0: 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20  Op; pOp--){.    
7fc0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
7fd0: 65 20 3c 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f  e <= P4_FREE_IF_
7fe0: 4c 45 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  LE ) freeP4(db, 
7ff0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
8000: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
8010: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
8020: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
8030: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8040: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
8050: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
8060: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c    .    }.    sql
8070: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
8080: 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   aOp);.  }.}../*
8090: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
80a0: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
80b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
80c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
80d0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
80e0: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
80f0: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
8100: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
8110: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
8120: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
8130: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
8140: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
8150: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
8160: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
8170: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
8180: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
8190: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
81a0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
81b0: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
81c0: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
81d0: 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f   Change the opco
81e0: 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20  de at addr into 
81f0: 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73  OP_Noop.*/.int s
8200: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8210: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
8220: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62  int addr){.  Vdb
8230: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
8240: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8250: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
8260: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
8270: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
8280: 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e   );.  pOp = &p->
8290: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
82a0: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
82b0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
82c0: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70  p);.  pOp->p4typ
82d0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
82e0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b    pOp->p4.z = 0;
82f0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
8300: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75   OP_Noop;.  retu
8310: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
8320: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
8330: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
8340: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
8350: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
8360: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
8370: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
8380: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
8390: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
83a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
83b0: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
83c0: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
83d0: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  8 op){.  if( p->
83e0: 6e 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b  nOp>0 && p->aOp[
83f0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
8400: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ==op ){.    retu
8410: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  rn sqlite3VdbeCh
8420: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
8430: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  >nOp-1);.  }else
8440: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8450: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
8460: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
8470: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
8480: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
8490: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
84a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
84b0: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
84c0: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
84d0: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
84e0: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
84f0: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
8500: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
8510: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
8520: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
8530: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
8540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
8550: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
8560: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
8570: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
8580: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
8590: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
85a0: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
85b0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
85c0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
85d0: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
85e0: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
85f0: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
8600: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
8610: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
8620: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
8630: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
8640: 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  P4..** .** Other
8650: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
8660: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
8670: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
8680: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
8690: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
86a0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
86b0: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
86c0: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
86d0: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
86e0: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
86f0: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
8700: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
8710: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
8720: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
8730: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
8740: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
8750: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
8760: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
8770: 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  d SQLITE_NOINLIN
8780: 45 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75  E vdbeChangeP4Fu
8790: 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20  ll(.  Vdbe *p,. 
87a0: 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73   Op *pOp,.  cons
87b0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69  t char *zP4,.  i
87c0: 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f  nt n.){.  if( pO
87d0: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
87e0: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
87f0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
8800: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d  >p4.p);.    pOp-
8810: 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  >p4type = 0;.   
8820: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
8830: 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b    }.  if( n<0 ){
8840: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8850: 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74  ChangeP4(p, (int
8860: 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c  )(pOp - p->aOp),
8870: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73   zP4, n);.  }els
8880: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
8890: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
88a0: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
88b0: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
88c0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
88d0: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
88e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
88f0: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
8900: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8910: 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a  eChangeP4(Vdbe *
8920: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e  p, int addr, con
8930: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e  st char *zP4, in
8940: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b  t n){.  Op *pOp;
8950: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8960: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
8970: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
8980: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
8990: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
89a0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
89b0: 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62   p->aOp!=0 || db
89c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
89d0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
89e0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
89f0: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
8a00: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
8a10: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
8a20: 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  zP4);.    return
8a30: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
8a40: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
8a50: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
8a60: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
8a70: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
8a80: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
8a90: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
8aa0: 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d  addr];.  if( n>=
8ab0: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65  0 || pOp->p4type
8ac0: 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e   ){.    vdbeChan
8ad0: 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c  geP4Full(p, pOp,
8ae0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65   zP4, n);.    re
8af0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
8b00: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
8b10: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
8b20: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
8b30: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
8b40: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
8b50: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
8b60: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
8b70: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
8b80: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
8b90: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
8ba0: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
8bb0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
8bc0: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
8bd0: 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20   if( zP4!=0 ){. 
8be0: 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29     assert( n<0 )
8bf0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
8c00: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
8c10: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
8c20: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
8c30: 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54      if( n==P4_VT
8c40: 41 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  AB ) sqlite3Vtab
8c50: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50  Lock((VTable*)zP
8c60: 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  4);.  }.}../*.**
8c70: 20 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 6f   Change the P4 o
8c80: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f  perand of the mo
8c90: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
8ca0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a  d instruction .*
8cb0: 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 64  * to the value d
8cc0: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 61 72  efined by the ar
8cd0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69  guments.  This i
8ce0: 73 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  s a high-speed.*
8cf0: 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  * version of sql
8d00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
8d10: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  ()..**.** The P4
8d20: 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f   operand must no
8d30: 74 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76  t have been prev
8d40: 69 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e 20  iously defined. 
8d50: 20 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20   And the new.** 
8d60: 50 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 50  P4 must not be P
8d70: 34 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73 71  4_INT32.  Use sq
8d80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8d90: 34 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f 66  4() in either of
8da0: 0a 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73 2e  .** those cases.
8db0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8dc0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 56 64 62  VdbeAppendP4(Vdb
8dd0: 65 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c  e *p, void *pP4,
8de0: 20 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f   int n){.  VdbeO
8df0: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
8e00: 28 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26 26  ( n!=P4_INT32 &&
8e10: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20   n!=P4_VTAB );. 
8e20: 20 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b   assert( n<=0 );
8e30: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
8e40: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
8e50: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
8e60: 6e 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65  n, pP4);.  }else
8e70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
8e80: 34 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  4!=0 );.    asse
8e90: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
8ea0: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
8eb0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20  p[p->nOp-1];.   
8ec0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
8ed0: 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44  type==P4_NOTUSED
8ee0: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   );.    pOp->p4t
8ef0: 79 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70  ype = n;.    pOp
8f00: 2d 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20  ->p4.p = pP4;.  
8f10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
8f20: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  he P4 on the mos
8f30: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8f40: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b   opcode to the K
8f50: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a  eyInfo for the.*
8f60: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a  * index given..*
8f70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
8f80: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50  beSetP4KeyInfo(P
8f90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
8fa0: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64  dex *pIdx){.  Vd
8fb0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
8fc0: 70 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f  pVdbe;.  KeyInfo
8fd0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73   *pKeyInfo;.  as
8fe0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
8ff0: 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
9000: 29 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  );.  pKeyInfo = 
9010: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
9020: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
9030: 64 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  dx);.  if( pKeyI
9040: 6e 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62  nfo ) sqlite3Vdb
9050: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
9060: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
9070: 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  O);.}..#ifdef SQ
9080: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
9090: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a  AIN_COMMENTS./*.
90a0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
90b0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  mment on the mos
90c0: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
90d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
90e0: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
90f0: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
9100: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
9110: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
9120: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
9130: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
9140: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
9150: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
9160: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
9170: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
9180: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
9190: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
91a0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
91b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
91c0: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
91d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
91e0: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
91f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9200: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
9210: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
9220: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
9230: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9240: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
9250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9260: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
9270: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
9280: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
9290: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
92a0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
92b0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
92c0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
92d0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
92e0: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
92f0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
9300: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
9310: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
9320: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
9330: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
9340: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
9350: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
9360: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
9370: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
9380: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
9390: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
93a0: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
93b0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
93c0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
93d0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
93e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
93f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
9400: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
9410: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
9420: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
9430: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
9440: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
9450: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
9460: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
9470: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
9480: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
9490: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
94a0: 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63  alue if the iSrc
94b0: 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74  Line field for t
94c0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  he previously co
94d0: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
94e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
94f0: 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65  VdbeSetLineNumbe
9500: 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  r(Vdbe *v, int i
9510: 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Line){.  sqlite3
9520: 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d  VdbeGetOp(v,-1)-
9530: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
9540: 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
9550: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
9560: 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AGE */../*.** Re
9570: 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20  turn the opcode 
9580: 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72  for a given addr
9590: 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64  ess.  If the add
95a0: 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e  ress is -1, then
95b0: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d  .** return the m
95c0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
95d0: 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  erted opcode..**
95e0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
95f0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
9600: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72   has occurred pr
9610: 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69  ior to the calli
9620: 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f  ng of this.** ro
9630: 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f  utine, then a po
9640: 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79  inter to a dummy
9650: 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20   VdbeOp will be 
9660: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20  returned.  That 
9670: 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61  opcode.** is rea
9680: 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72  dable but not wr
9690: 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69  itable, though i
96a0: 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77  t is cast to a w
96b0: 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a  ritable value..*
96c0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20  * The return of 
96d0: 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61  a dummy opcode a
96e0: 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74  llows the call t
96f0: 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74  o continue funct
9700: 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20  ioning.** after 
9710: 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74  an OOM fault wit
9720: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
9730: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
9740: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
9750: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9760: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
9770: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
9780: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
9790: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
97a0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
97b0: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
97c0: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
97d0: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
97e0: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
97f0: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
9800: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
9810: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
9820: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
9830: 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66  .  /* C89 specif
9840: 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ies that the con
9850: 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69  stant "dummy" wi
9860: 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
9870: 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65  d to all.  ** ze
9880: 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f  ros, which is co
9890: 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e  rrect.  MSVC gen
98a0: 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67  erates a warning
98b0: 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20  , nevertheless. 
98c0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65  */.  static Vdbe
98d0: 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67  Op dummy;  /* Ig
98e0: 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61  nore the MSVC wa
98f0: 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69  rning about no i
9900: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20  nitializer */.  
9910: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
9920: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
9930: 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  T );.  if( addr<
9940: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
9950: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
9960: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
9970: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
9980: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
9990: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
99a0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
99b0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
99c0: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
99d0: 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ummy;.  }else{. 
99e0: 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f     return &p->aO
99f0: 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a  p[addr];.  }.}..
9a00: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
9a10: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
9a20: 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a  N_COMMENTS)./*.*
9a30: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
9a40: 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e  ger value for on
9a50: 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  e of the paramet
9a60: 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64  ers to the opcod
9a70: 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69  e pOp.** determi
9a80: 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72  ned by character
9a90: 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   c..*/.static in
9aa0: 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61  t translateP(cha
9ab0: 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70  r c, const Op *p
9ac0: 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31  Op){.  if( c=='1
9ad0: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
9ae0: 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27  p1;.  if( c=='2'
9af0: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
9b00: 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20  2;.  if( c=='3' 
9b10: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33  ) return pOp->p3
9b20: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29  ;.  if( c=='4' )
9b30: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e   return pOp->p4.
9b40: 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d  i;.  return pOp-
9b50: 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  >p5;.}../*.** Co
9b60: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66  mpute a string f
9b70: 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22  or the "comment"
9b80: 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45   field of a VDBE
9b90: 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e   opcode listing.
9ba0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70  .**.** The Synop
9bb0: 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f  sis: field in co
9bc0: 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64  mments in the vd
9bd0: 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65  be.c source file
9be0: 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a   gets converted.
9bf0: 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73  ** to an extra s
9c00: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70  tring that is ap
9c10: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71  pended to the sq
9c20: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
9c30: 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62  ).  In the.** ab
9c40: 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63  sence of other c
9c50: 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79  omments, this sy
9c60: 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74  nopsis becomes t
9c70: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
9c80: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d  e opcode..** Som
9c90: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63  e translation oc
9ca0: 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  curs:.**.**     
9cb0: 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20    "PX"      ->  
9cc0: 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20  "r[X]".**       
9cd0: 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72  "PX@PY"   ->  "r
9ce0: 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20  [X..X+Y-1]"  or 
9cf0: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
9d00: 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22   or 1.**       "
9d10: 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b  PX@PY+1" ->  "r[
9d20: 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22  X..X+Y]"    or "
9d30: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a  r[x]" if y is 0.
9d40: 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59  **       "PY..PY
9d50: 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22  "  ->  "r[X..Y]"
9d60: 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20        or "r[x]" 
9d70: 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69  if y<=x.*/.stati
9d80: 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d  c int displayCom
9d90: 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70  ment(.  const Op
9da0: 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68   *pOp,     /* Th
9db0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63  e opcode to be c
9dc0: 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f  ommented */.  co
9dd0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
9de0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f   /* Previously o
9df0: 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f  btained value fo
9e00: 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a  r P4 */.  char *
9e10: 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20  zTemp,       /* 
9e20: 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72  Write result her
9e30: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70  e */.  int nTemp
9e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
9e50: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ce available in 
9e60: 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  zTemp[] */.){.  
9e70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e  const char *zOpN
9e80: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
9e90: 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20  r *zSynopsis;.  
9ea0: 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69  int nOpName;.  i
9eb0: 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61  nt ii, jj;.  cha
9ec0: 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f  r zAlt[50];.  zO
9ed0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  pName = sqlite3O
9ee0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
9ef0: 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d  pcode);.  nOpNam
9f00: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
9f10: 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20  n30(zOpName);.  
9f20: 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e  if( zOpName[nOpN
9f30: 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e  ame+1] ){.    in
9f40: 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20  t seenCom = 0;. 
9f50: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a     char c;.    z
9f60: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61  Synopsis = zOpNa
9f70: 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20  me += nOpName + 
9f80: 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  1;.    if( strnc
9f90: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46  mp(zSynopsis,"IF
9fa0: 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20   ",3)==0 ){.    
9fb0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
9fc0: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29  SQLITE_STOREP2 )
9fd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9fe0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
9ff0: 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22  f(zAlt), zAlt, "
a000: 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a  r[P2] = (%s)", z
a010: 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20  Synopsis+3);.   
a020: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a030: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a040: 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c  tf(sizeof(zAlt),
a050: 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67 6f   zAlt, "if %s go
a060: 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69  to P2", zSynopsi
a070: 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s+3);.      }.  
a080: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
a090: 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zAlt;.    }.    
a0a0: 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c  for(ii=jj=0; jj<
a0b0: 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20  nTemp-1 && (c = 
a0c0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d  zSynopsis[ii])!=
a0d0: 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  0; ii++){.      
a0e0: 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20  if( c=='P' ){.  
a0f0: 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70        c = zSynop
a100: 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20  sis[++ii];.     
a110: 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b     if( c=='4' ){
a120: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a130: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
a140: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
a150: 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20  "%s", zP4);.    
a160: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
a170: 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='X' ){.        
a180: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a190: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
a1a0: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70  mp+jj, "%s", pOp
a1b0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
a1c0: 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d         seenCom =
a1d0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
a1e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
a1f0: 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v1 = translateP
a200: 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  (c, pOp);.      
a210: 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20      int v2;.    
a220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
a230: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
a240: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c   zTemp+jj, "%d",
a250: 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   v1);.          
a260: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
a270: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22  opsis+ii+1, "@P"
a280: 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 2)==0 ){.     
a290: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a         ii += 3;.
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b              jj +
a2b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a2c0: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
a2d0: 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72           v2 = tr
a2e0: 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73  anslateP(zSynops
a2f0: 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20  is[ii], pOp);.  
a300: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
a310: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
a320: 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20  ii+1,"+1",2)==0 
a330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a340: 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   ii += 2;.      
a350: 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20          v2++;.  
a360: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a370: 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31          if( v2>1
a380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a390: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a3a0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
a3b0: 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76  mp+jj, "..%d", v
a3c0: 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20  1+v2-1);.       
a3d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a3e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
a3f0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
a400: 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30  1, "..P3", 4)==0
a410: 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29   && pOp->p3==0 )
a420: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
a430: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
a440: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
a450: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
a460: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
a470: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +jj);.      }els
a480: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  e{.        zTemp
a490: 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  [jj++] = c;.    
a4a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
a4b0: 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a  ( !seenCom && jj
a4c0: 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d  <nTemp-5 && pOp-
a4d0: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
a4e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a4f0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
a500: 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20  emp+jj, "; %s", 
a510: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
a520: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
a530: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
a540: 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p+jj);.    }.   
a550: 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20   if( jj<nTemp ) 
a560: 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20  zTemp[jj] = 0;. 
a570: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
a580: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
a590: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a5a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
a5b0: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
a5c0: 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71  nt);.    jj = sq
a5d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
a5e0: 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  emp);.  }else{. 
a5f0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
a600: 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d  .    jj = 0;.  }
a610: 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a  .  return jj;.}.
a620: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a630: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56  _DEBUG */..#if V
a640: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
a650: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
a660: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
a670: 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  INTS)./*.** Tran
a680: 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78  slate the P4.pEx
a690: 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20  pr value for an 
a6a0: 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70  OP_CursorHint op
a6b0: 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a  code into text.*
a6c0: 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69  * that can be di
a6d0: 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50  splayed in the P
a6e0: 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c  4 column of EXPL
a6f0: 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73  AIN output..*/.s
a700: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
a710: 61 79 50 34 45 78 70 72 28 53 74 72 41 63 63 75  ayP4Expr(StrAccu
a720: 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78 70  m *p, Expr *pExp
a730: 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
a740: 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69   *zOp = 0;.  swi
a750: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
a760: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  {.    case TK_ST
a770: 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69  RING:.      sqli
a780: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a790: 70 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e  p, "%Q", pExpr->
a7a0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
a7b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a7c0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
a7d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
a7e0: 70 70 65 6e 64 66 28 70 2c 20 22 25 64 22 2c 20  ppendf(p, "%d", 
a7f0: 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29  pExpr->u.iValue)
a800: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a810: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
a820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a830: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 4e  tr_appendf(p, "N
a840: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ULL");.      bre
a850: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a860: 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
a870: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a880: 70 65 6e 64 66 28 70 2c 20 22 72 5b 25 64 5d 22  pendf(p, "r[%d]"
a890: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
a8a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a8b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a8c0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
a8d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
a8e0: 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
a8f0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a900: 65 6e 64 66 28 70 2c 20 22 72 6f 77 69 64 22 29  endf(p, "rowid")
a910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
a930: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 63  tr_appendf(p, "c
a940: 25 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d  %d", (int)pExpr-
a950: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
a960: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
a970: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a980: 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_LT:      zOp =
a990: 20 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61   "LT";      brea
a9a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
a9b0: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  E:      zOp = "L
a9c0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
a9d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20      case TK_GT: 
a9e0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b       zOp = "GT";
a9f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aa00: 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
aa10: 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20    zOp = "GE";   
aa20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
aa30: 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a  se TK_NE:      z
aa40: 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20  Op = "NE";      
aa50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
aa60: 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20  TK_EQ:      zOp 
aa70: 3d 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65  = "EQ";      bre
aa80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
aa90: 49 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  IS:      zOp = "
aaa0: 49 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  IS";      break;
aab0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
aac0: 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e  OT:   zOp = "ISN
aad0: 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OT";   break;.  
aae0: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20    case TK_AND:  
aaf0: 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20     zOp = "AND"; 
ab00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
ab10: 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20  ase TK_OR:      
ab20: 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20  zOp = "OR";     
ab30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ab40: 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70   TK_PLUS:    zOp
ab50: 20 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72   = "ADD";     br
ab60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
ab70: 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20  _STAR:    zOp = 
ab80: 22 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b  "MUL";     break
ab90: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  ;.    case TK_MI
aba0: 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55  NUS:   zOp = "SU
abb0: 42 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  B";     break;. 
abc0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20     case TK_REM: 
abd0: 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b      zOp = "REM";
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
abf0: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
ac00: 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b   zOp = "BITAND";
ac10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ac20: 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f  e TK_BITOR:   zO
ac30: 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62  p = "BITOR";   b
ac40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
ac50: 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d  K_SLASH:   zOp =
ac60: 20 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61   "DIV";     brea
ac70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
ac80: 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c  SHIFT:  zOp = "L
ac90: 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a  SHIFT";  break;.
aca0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
acb0: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49  FT:  zOp = "RSHI
acc0: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
acd0: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
ace0: 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22    zOp = "CONCAT"
acf0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
ad00: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a  se TK_UMINUS:  z
ad10: 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20  Op = "MINUS";   
ad20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ad30: 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20  TK_UPLUS:   zOp 
ad40: 3d 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65  = "PLUS";    bre
ad50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ad60: 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22  BITNOT:  zOp = "
ad70: 42 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b  BITNOT";  break;
ad80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
ad90: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54  :     zOp = "NOT
ada0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
adb0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
adc0: 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c  :  zOp = "ISNULL
add0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
ade0: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
adf0: 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b  zOp = "NOTNULL";
ae00: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
ae10: 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69  ault:.      sqli
ae20: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
ae30: 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22 29  p, "%s", "expr")
ae40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ae50: 20 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b   }..  if( zOp ){
ae60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
ae70: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25 73 28  _appendf(p, "%s(
ae80: 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73  ", zOp);.    dis
ae90: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45  playP4Expr(p, pE
aea0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
aeb0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
aec0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
aed0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70  te3_str_append(p
aee0: 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ",", 1);.     
aef0: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
af00: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
af10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
af20: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70  te3_str_append(p
af30: 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d  , ")", 1);.  }.}
af40: 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f  .#endif /* VDBE_
af50: 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65  DISPLAY_P4 && de
af60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
af70: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
af80: 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f  ) */...#if VDBE_
af90: 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a  DISPLAY_P4./*.**
afa0: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
afb0: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
afc0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
afd0: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
afe0: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
aff0: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
b000: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
b010: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
b020: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34   char *displayP4
b030: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
b040: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
b050: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d  ){.  char *zP4 =
b060: 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63   zTemp;.  StrAcc
b070: 75 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20  um x;.  assert( 
b080: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
b090: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
b0a0: 69 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c  it(&x, 0, zTemp,
b0b0: 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77   nTemp, 0);.  sw
b0c0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
b0d0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
b0e0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
b0f0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b    int j;.      K
b100: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
b110: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
b120: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
b130: 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
b140: 72 74 46 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20  rtFlags!=0 );.  
b150: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b160: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 6b 28 25  appendf(&x, "k(%
b170: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  d", pKeyInfo->nK
b180: 65 79 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  eyField);.      
b190: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
b1a0: 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20  nfo->nKeyField; 
b1b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
b1c0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
b1d0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
b1e0: 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
b1f0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
b200: 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll ? pColl->zN
b210: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20  ame : "";.      
b220: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f    if( strcmp(zCo
b230: 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30  ll, "BINARY")==0
b240: 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a   ) zColl = "B";.
b250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b260: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b270: 22 2c 25 73 25 73 25 73 22 2c 20 0a 20 20 20 20  ",%s%s%s", .    
b280: 20 20 20 20 20 20 20 20 20 20 20 28 70 4b 65 79             (pKey
b290: 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73  Info->aSortFlags
b2a0: 5b 6a 5d 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52  [j] & KEYINFO_OR
b2b0: 44 45 52 5f 44 45 53 43 29 20 3f 20 22 2d 22 20  DER_DESC) ? "-" 
b2c0: 3a 20 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20  : "", .         
b2d0: 20 20 20 20 20 20 28 70 4b 65 79 49 6e 66 6f 2d        (pKeyInfo-
b2e0: 3e 61 53 6f 72 74 46 6c 61 67 73 5b 6a 5d 20 26  >aSortFlags[j] &
b2f0: 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 42   KEYINFO_ORDER_B
b300: 49 47 4e 55 4c 4c 29 3f 20 22 4e 2e 22 20 3a 20  IGNULL)? "N." : 
b310: 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "", .           
b320: 20 20 20 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20      zColl);.    
b330: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b340: 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c  3_str_append(&x,
b350: 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ")", 1);.      
b360: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
b370: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b380: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
b390: 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a     case P4_EXPR:
b3a0: 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79   {.      display
b3b0: 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e  P4Expr(&x, pOp->
b3c0: 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  p4.pExpr);.     
b3d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
b3e0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
b3f0: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
b400: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
b410: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
b420: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b430: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b440: 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  "(%.20s)", pColl
b450: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
b460: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b470: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
b480: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
b490: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
b4a0: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
b4b0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b4c0: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
b4d0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
b4e0: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
b4f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b500: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
b510: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
b520: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
b530: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
b540: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75  CCTX: {.      Fu
b550: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
b560: 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e  p->p4.pCtx->pFun
b570: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
b580: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b590: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
b5a0: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
b5b0: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
b5c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b5d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
b5e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b5f0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b600: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
b610: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
b620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b630: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
b640: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b650: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b660: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
b670: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b680: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b690: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
b6a0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b6b0: 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20  df(&x, "%.16g", 
b6c0: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
b6d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b6e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
b6f0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
b700: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
b710: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
b720: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
b730: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
b740: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
b750: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b760: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28   pMem->flags & (
b770: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52  MEM_Int|MEM_IntR
b780: 65 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eal) ){.        
b790: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b7a0: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
b7b0: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
b7c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
b7d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
b7e0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
b7f0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b800: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70  f(&x, "%.16g", p
b810: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Mem->u.r);.     
b820: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
b830: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
b840: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  l ){.        zP4
b850: 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20   = "NULL";.     
b860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b870: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
b880: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
b890: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
b8a0: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
b8b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b8c0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
b8d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
b8e0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
b8f0: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
b900: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
b910: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
b920: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
b930: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
b940: 70 65 6e 64 66 28 26 78 2c 20 22 76 74 61 62 3a  pendf(&x, "vtab:
b950: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
b960: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b970: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
b980: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
b990: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b9a0: 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d    int *ai = pOp-
b9b0: 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e  >p4.ai;.      in
b9c0: 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f  t n = ai[0];   /
b9d0: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
b9e0: 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52  ent of an INTARR
b9f0: 41 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  AY is always the
ba00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba10: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74          ** count
ba20: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
ba30: 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f  f elements to fo
ba40: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f  llow */.      fo
ba50: 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b  r(i=1; i<=n; i++
ba60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ba70: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
ba80: 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29  x, ",%d", ai[i])
ba90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
baa0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a  zTemp[0] = '[';.
bab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
bac0: 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 5d 22  r_append(&x, "]"
bad0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
bae0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
baf0: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
bb00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
bb10: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
bb20: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
bb30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bb40: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42      case P4_DYNB
bb50: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34  LOB:.    case P4
bb60: 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20  _ADVANCE: {.    
bb70: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
bb80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bb90: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54   }.    case P4_T
bba0: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
bbb0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
bbc0: 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d  f(&x, "%s", pOp-
bbd0: 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  >p4.pTab->zName)
bbe0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bbf0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
bc00: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
bc10: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
bc20: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
bc30: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
bc40: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
bc50: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
bc60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
bc70: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
bc80: 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72  ish(&x);.  asser
bc90: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
bca0: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
bcb0: 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50  dif /* VDBE_DISP
bcc0: 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LAY_P4 */../*.**
bcd0: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
bce0: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
bcf0: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
bd00: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
bd10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70  ..**.** The prep
bd20: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
bd30: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20  need to know in 
bd40: 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70  advance the comp
bd50: 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61  lete set of.** a
bd60: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
bd70: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  s that will be u
bd80: 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  se.  A mask of t
bd90: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
bda0: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
bdb0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e  in p->btreeMask.
bdc0: 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73    The p->lockMas
bdd0: 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  k value is the s
bde0: 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62  ubset of.** p->b
bdf0: 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61  treeMask of data
be00: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
be10: 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a  require a lock..
be20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
be30: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
be40: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
be50: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
be60: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
be70: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44  i<(int)sizeof(yD
be80: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
be90: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
bea0: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
beb0: 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53  )*8 );.  DbMaskS
bec0: 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  et(p->btreeMask,
bed0: 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20   i);.  if( i!=1 
bee0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  && sqlite3BtreeS
bef0: 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61  harable(p->db->a
bf00: 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20  Db[i].pBt) ){.  
bf10: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c    DbMaskSet(p->l
bf20: 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d  ockMask, i);.  }
bf30: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
bf40: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
bf50: 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a  RED_CACHE)./*.**
bf60: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
bf70: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
bf80: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
bf90: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
bfa0: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
bfb0: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
bfc0: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
bfd0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
bfe0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
bff0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
c000: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
c010: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
c020: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
c030: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
c040: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
c050: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
c060: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
c070: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
c080: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
c090: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
c0a0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
c0b0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
c0c0: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
c0d0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
c0e0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
c0f0: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
c100: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
c110: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
c120: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
c130: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
c140: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
c150: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
c160: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
c170: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
c180: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
c190: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
c1a0: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
c1b0: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
c1c0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
c1d0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
c1e0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
c1f0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
c200: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
c210: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
c220: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
c230: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
c240: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
c250: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
c260: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
c270: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
c280: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
c290: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
c2a0: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
c2b0: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
c2c0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
c2d0: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
c2e0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
c2f0: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
c300: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
c310: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
c320: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
c330: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
c340: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
c350: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
c360: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
c370: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
c380: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
c390: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
c3a0: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
c3b0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
c3c0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
c3d0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
c3e0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
c3f0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
c400: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
c410: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
c420: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
c430: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
c440: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
c450: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
c460: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
c470: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
c480: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c490: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
c4a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
c4b0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
c4c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
c4d0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
c4e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
c4f0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
c500: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
c510: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
c520: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
c530: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
c540: 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  r()..*/.static S
c550: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
c560: 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64  oid vdbeLeave(Vd
c570: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
c580: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c590: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
c5a0: 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   nDb;.  db = p->
c5b0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
c5c0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
c5d0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
c5e0: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
c5f0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
c600: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
c610: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
c620: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
c630: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c640: 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b  3BtreeLeave(aDb[
c650: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
c660: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
c670: 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20  3VdbeLeave(Vdbe 
c680: 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73  *p){.  if( DbMas
c690: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b  kAllZero(p->lock
c6a0: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20  Mask) ) return; 
c6b0: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
c6c0: 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61  ase */.  vdbeLea
c6d0: 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ve(p);.}.#endif.
c6e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
c6f0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
c700: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
c710: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
c720: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
c730: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
c740: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
c750: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
c760: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
c770: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
c780: 2c 20 69 6e 74 20 70 63 2c 20 56 64 62 65 4f 70  , int pc, VdbeOp
c790: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
c7a0: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
c7b0: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f  [50];.  char zCo
c7c0: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63  m[100];.  static
c7d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
c7e0: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
c7f0: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
c800: 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  -13s %.2X %s\n";
c810: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
c820: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
c830: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
c840: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
c850: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64  eof(zPtr));.#ifd
c860: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c870: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
c880: 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  S.  displayComme
c890: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f  nt(pOp, zP4, zCo
c8a0: 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29  m, sizeof(zCom))
c8b0: 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30  ;.#else.  zCom[0
c8c0: 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  ] = 0;.#endif.  
c8d0: 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69  /* NB:  The sqli
c8e0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20  te3OpcodeName() 
c8f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
c900: 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20  emented by code 
c910: 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20  created.  ** by 
c920: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
c930: 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e  k and mkopcodec.
c940: 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63  awk scripts whic
c950: 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20  h extract the.  
c960: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
c970: 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73  rom the vdbe.c s
c980: 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20  ource text */.  
c990: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
c9a0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
c9b0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
c9c0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
c9d0: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
c9e0: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
c9f0: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20  4, pOp->p5,.    
ca00: 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66    zCom.  );.  ff
ca10: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
ca20: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
ca30: 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20  ialize an array 
ca40: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
ca50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ca60: 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65   initMemArray(Me
ca70: 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c  m *p, int N, sql
ca80: 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c  ite3 *db, u16 fl
ca90: 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28  ags){.  while( (
caa0: 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d  N--)>0 ){.    p-
cab0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
cac0: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
cad0: 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20      p->szMalloc 
cae0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
caf0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e  TE_DEBUG.    p->
cb00: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
cb10: 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a  #endif.    p++;.
cb20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
cb30: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
cb40: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
cb50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
cb60: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
cb70: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
cb80: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
cb90: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26     Mem *pEnd = &
cba0: 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  p[N];.    sqlite
cbb0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
cbc0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
cbd0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
cbe0: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
cbf0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
cc00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
cc10: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
cc20: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
cc30: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
cc40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
cc50: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
cc60: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
cc70: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
cc80: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
cc90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
cca0: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
ccb0: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
ccc0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
ccd0: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
cce0: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
ccf0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
cd00: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
cd10: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
cd20: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
cd30: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
cd40: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
cd50: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
cd60: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
cd70: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
cd80: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
cd90: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
cda0: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
cdb0: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
cdc0: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
cdd0: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
cde0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
cdf0: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
ce00: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
ce10: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
ce20: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
ce30: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
ce40: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
ce50: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
ce60: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
ce70: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
ce80: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
ce90: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
cea0: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
ceb0: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
cec0: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
ced0: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
cee0: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
cef0: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
cf00: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
cf10: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
cf20: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
cf30: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
cf40: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
cf50: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
cf60: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
cf70: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
cf80: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
cf90: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
cfa0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
cfb0: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
cfc0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
cfd0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
cfe0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cff0: 70 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69 74 65 33  p->xDel==sqlite3
d000: 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 20  VdbeFrameMemDel 
d010: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
d020: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
d030: 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20  EM_Dyn) ){.     
d040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
d050: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
d060: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
d070: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
d080: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d090: 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  eNN(db, p->zMall
d0a0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
d0b0: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
d0c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
d0d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
d0e0: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c  fined;.    }whil
d0f0: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
d100: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53  .  }.}..#ifdef S
d110: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
d120: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 70 46  * Verify that pF
d130: 72 61 6d 65 20 69 73 20 61 20 76 61 6c 69 64 20  rame is a valid 
d140: 56 64 62 65 46 72 61 6d 65 20 70 6f 69 6e 74 65  VdbeFrame pointe
d150: 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  r.  Return true 
d160: 69 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 64 20  if it is.** and 
d170: 66 61 6c 73 65 20 69 66 20 73 6f 6d 65 74 68 69  false if somethi
d180: 6e 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a  ng is wrong..**.
d190: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d1a0: 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  is intended for 
d1b0: 75 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73  use inside of as
d1c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
d1d0: 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  s only..*/.int s
d1e0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49  qlite3VdbeFrameI
d1f0: 73 56 61 6c 69 64 28 56 64 62 65 46 72 61 6d 65  sValid(VdbeFrame
d200: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69 66 28   *pFrame){.  if(
d210: 20 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65 4d   pFrame->iFrameM
d220: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 46 52 41  agic!=SQLITE_FRA
d230: 4d 45 5f 4d 41 47 49 43 20 29 20 72 65 74 75 72  ME_MAGIC ) retur
d240: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
d250: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
d260: 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 73 74  * This is a dest
d270: 72 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65 6d 20  ructor on a Mem 
d280: 6f 62 6a 65 63 74 20 28 77 68 69 63 68 20 69 73  object (which is
d290: 20 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c 69 74   really an sqlit
d2a0: 65 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74 68 61  e3_value).** tha
d2b0: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 46 72  t deletes the Fr
d2c0: 61 6d 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ame object that 
d2d0: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  is attached to i
d2e0: 74 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a 2a 0a  t as a blob..**.
d2f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d300: 64 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74 65 20  does not delete 
d310: 74 68 65 20 46 72 61 6d 65 20 72 69 67 68 74 20  the Frame right 
d320: 61 77 61 79 2e 20 20 49 74 20 6d 65 72 65 6c 79  away.  It merely
d330: 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 66 72 61   adds the.** fra
d340: 6d 65 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20  me to a list of 
d350: 66 72 61 6d 65 73 20 74 6f 20 62 65 20 64 65 6c  frames to be del
d360: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  eted when the Vd
d370: 62 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76 6f 69  be halts..*/.voi
d380: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
d390: 6d 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20 2a 70  meMemDel(void *p
d3a0: 41 72 67 29 7b 0a 20 20 56 64 62 65 46 72 61 6d  Arg){.  VdbeFram
d3b0: 65 20 2a 70 46 72 61 6d 65 20 3d 20 28 56 64 62  e *pFrame = (Vdb
d3c0: 65 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a 20 20  eFrame*)pArg;.  
d3d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
d3e0: 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28  dbeFrameIsValid(
d3f0: 70 46 72 61 6d 65 29 20 29 3b 0a 20 20 70 46 72  pFrame) );.  pFr
d400: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  ame->pParent = p
d410: 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72  Frame->v->pDelFr
d420: 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 76  ame;.  pFrame->v
d430: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 46  ->pDelFrame = pF
d440: 72 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rame;.}.../*.** 
d450: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
d460: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
d470: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
d480: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
d490: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
d4a0: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
d4b0: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
d4c0: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
d4d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d4e0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
d4f0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
d500: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
d510: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
d520: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
d530: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
d540: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
d550: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
d560: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d570: 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64  VdbeFrameIsValid
d580: 28 70 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  (p) );.  for(i=0
d590: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
d5a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
d5b0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
d5c0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
d5d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
d5e0: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
d5f0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
d600: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
d610: 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64  eAuxData(p->v->d
d620: 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c  b, &p->pAuxData,
d630: 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   -1, 0);.  sqlit
d640: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
d650: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
d660: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
d670: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
d680: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
d690: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
d6a0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
d6b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
d6c0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
d6d0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
d6e0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
d6f0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
d700: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
d710: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
d720: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
d730: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
d740: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
d750: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
d760: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
d770: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
d780: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
d790: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
d7a0: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
d7b0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
d7c0: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
d7d0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
d7e0: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
d7f0: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
d800: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
d810: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
d820: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
d830: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
d840: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
d850: 2a 20 32 30 31 38 2d 30 34 2d 32 34 3a 20 20 49  * 2018-04-24:  I
d860: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  n p->explain==2 
d870: 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69  mode, the OP_Ini
d880: 74 20 6f 70 63 6f 64 65 73 20 6f 66 20 74 72 69  t opcodes of tri
d890: 67 67 65 72 73 0a 2a 2a 20 61 72 65 20 61 6c 73  ggers.** are als
d8a0: 6f 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68 61 74  o shown, so that
d8b0: 20 74 68 65 20 62 6f 75 6e 64 61 72 69 65 73 20   the boundaries 
d8c0: 62 65 74 77 65 65 6e 20 74 68 65 20 6d 61 69 6e  between the main
d8d0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a 20   program and.** 
d8e0: 65 61 63 68 20 74 72 69 67 67 65 72 20 61 72 65  each trigger are
d8f0: 20 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68   clear..**.** Wh
d900: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
d910: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
d920: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
d930: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
d940: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
d950: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
d960: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
d970: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d980: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
d990: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
d9a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
d9b0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
d9c0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
d9f0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
da00: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
da10: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
da30: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
da40: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
da50: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
da60: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
da70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
da80: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
da90: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
daa0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
dab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
dac0: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
dad0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
dae0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
daf0: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
db00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
db10: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
db20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
db30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
db60: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
db70: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
db80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
db90: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
dba0: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
dbb0: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
dbc0: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
dbd0: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
dbe0: 0a 20 20 69 6e 74 20 62 4c 69 73 74 53 75 62 70  .  int bListSubp
dbf0: 72 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61  rogs = (p->expla
dc00: 69 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c  in==1 || (db->fl
dc10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54 72 69  ags & SQLITE_Tri
dc20: 67 67 65 72 45 51 50 29 21 3d 30 29 3b 0a 20 20  ggerEQP)!=0);.  
dc30: 4f 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20  Op *pOp = 0;..  
dc40: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
dc50: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
dc60: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
dc70: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
dc80: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
dc90: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
dca0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
dcb0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
dcc0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
dcd0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
dce0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
dcf0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
dd00: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
dd10: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
dd20: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
dd30: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
dd40: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
dd50: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
dd60: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
dd70: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
dd80: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
dd90: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
dda0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
ddb0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
ddc0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
ddd0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
dde0: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
ddf0: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
de00: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
de10: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
de20: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
de30: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
de40: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
de50: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
de60: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
de70: 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  t(db);.    retur
de80: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
de90: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
dea0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
deb0: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
dec0: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
ded0: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
dee0: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
def0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
df00: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
df10: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
df20: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
df30: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
df40: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
df50: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
df60: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
df70: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
df80: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
df90: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
dfa0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
dfb0: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
dfc0: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
dfd0: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
dfe0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
dff0: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
e000: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
e010: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
e020: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
e030: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
e040: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
e050: 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 29   bListSubprogs )
e060: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
e070: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
e080: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
e090: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
e0a0: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
e0b0: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
e0c0: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
e0d0: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
e0e0: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
e0f0: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
e100: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
e110: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
e120: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
e130: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
e140: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
e150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
e160: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
e170: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
e180: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
e190: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
e1a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
e1b0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
e1c0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
e1d0: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
e1e0: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
e1f0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
e200: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
e210: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
e220: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
e230: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
e240: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
e250: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
e260: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
e270: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
e280: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
e290: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
e2a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
e2b0: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
e2c0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
e2d0: 20 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20 4c   while(1){  /* L
e2e0: 6f 6f 70 20 65 78 69 74 73 20 76 69 61 20 62 72  oop exits via br
e2f0: 65 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d 20 70  eak */.    i = p
e300: 2d 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ->pc++;.    if( 
e310: 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20  i>=nRow ){.     
e320: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
e330: 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  OK;.      rc = S
e340: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
e350: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e360: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
e370: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
e380: 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62  output line numb
e390: 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  er is small enou
e3a0: 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73  gh that we are s
e3b0: 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20  till in the.    
e3c0: 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61    ** main progra
e3d0: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20  m. */.      pOp 
e3e0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
e3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
e400: 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74  * We are current
e410: 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72  ly listing subpr
e420: 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20  ograms.  Figure 
e430: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e  out which one an
e440: 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20  d.      ** pick 
e450: 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  up the appropria
e460: 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  te opcode. */.  
e470: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
e480: 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20   i -= p->nOp;.  
e490: 20 20 20 20 61 73 73 65 72 74 28 20 61 70 53 75      assert( apSu
e4a0: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  b!=0 );.      as
e4b0: 73 65 72 74 28 20 6e 53 75 62 3e 30 20 29 3b 0a  sert( nSub>0 );.
e4c0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
e4d0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
e4e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
e4f0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
e500: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
e510: 74 28 20 69 3c 61 70 53 75 62 5b 6a 5d 2d 3e 6e  t( i<apSub[j]->n
e520: 4f 70 20 7c 7c 20 6a 2b 31 3c 6e 53 75 62 20 29  Op || j+1<nSub )
e530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e540: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
e550: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a  >aOp[i];.    }..
e560: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
e570: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
e580: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
e590: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
e5a0: 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 61  hat has.    ** a
e5b0: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61   P4_SUBPROGRAM a
e5c0: 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64  rgument), expand
e5d0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e5e0: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
e5f0: 67 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65 70  grams.    ** kep
e600: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
e610: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
e620: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
e630: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
e640: 67 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20  gram.    ** has 
e650: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
e660: 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   seen..    */.  
e670: 20 20 69 66 28 20 62 4c 69 73 74 53 75 62 70 72    if( bListSubpr
e680: 6f 67 73 20 26 26 20 70 4f 70 2d 3e 70 34 74 79  ogs && pOp->p4ty
e690: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
e6a0: 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  M ){.      int n
e6b0: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
e6c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
e6d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
e6e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
e6f0: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
e700: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
e710: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
e720: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
e730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e740: 20 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20 20   j==nSub ){.    
e750: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
e760: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
e770: 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62  Sub, nByte, nSub
e780: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
e790: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
e7a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
e7b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
e7c0: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  R;.          bre
e7d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
e7e0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
e7f0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
e800: 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61 70  b->z;.        ap
e810: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
e820: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
e830: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c          pSub->fl
e840: 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  ags |= MEM_Blob;
e850: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e  .        pSub->n
e860: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
e870: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
e880: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f 70       nRow += pOp
e890: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e  ->p4.pProgram->n
e8a0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
e8b0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  }.    if( p->exp
e8c0: 6c 61 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b 0a  lain<2 ) break;.
e8d0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
e8e0: 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode==OP_Explain 
e8f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
e900: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
e910: 5f 49 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e 31  _Init && p->pc>1
e920: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20   ) break;.  }.. 
e930: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e940: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  OK ){.    if( db
e950: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
e960: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  ed ){.      p->r
e970: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
e980: 52 55 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d  RUPT;.      rc =
e990: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e9a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e9b0: 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33  Error(p, sqlite3
e9c0: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a  ErrStr(p->rc));.
e9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e9e0: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20   char *zP4;.    
e9f0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
ea00: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==1 ){.        p
ea10: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ea20: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  _Int;.        pM
ea30: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ea60: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
ea70: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b  /.        pMem++
ea80: 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 70  ;.    .        p
ea90: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
eaa0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
eab0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
eac0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
ead0: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
eae0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
eaf0: 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ); /* Opcode */.
eb00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
eb10: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
eb20: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
eb30: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
eb40: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
eb50: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
eb60: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
eb70: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20     pMem++;.     
eb80: 20 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   }..      pMem->
eb90: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
eba0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
ebb0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
ebe0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
ebf0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ec00: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
ec10: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
ec20: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ec40: 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P2 */.      pMe
ec50: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d  m++;..      pMem
ec60: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
ec70: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
ec80: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
ecb0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
ecc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
ecd0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
ece0: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29  esize(pMem, 100)
ecf0: 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20   ){ /* P4 */.   
ed00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ed10: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ed20: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
ed30: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
ed40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ed50: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ed60: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
ed70: 20 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c       zP4 = displ
ed80: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
ed90: 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f  z, pMem->szMallo
eda0: 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  c);.      if( zP
edb0: 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  4!=pMem->z ){.  
edc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
edd0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
ede0: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
edf0: 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53  pMem, zP4, -1, S
ee00: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
ee10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ee20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
ee30: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
ee40: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
ee50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
ee60: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  m->z);.        p
ee70: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
ee80: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 7d 0a  E_UTF8;.      }.
ee90: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
eea0: 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c       if( p->expl
eeb0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
eec0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
eed0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
eee0: 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20  ze(pMem, 4) ){. 
eef0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ef00: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
ef10: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
ef20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ef30: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
ef40: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
ef50: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
ef60: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
ef70: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
ef80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
ef90: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
efa0: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
efb0: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
efc0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
efd0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
efe0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  .        pMem++;
eff0: 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
f000: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
f010: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
f020: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
f030: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
f040: 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20  size(pMem, 500) 
f050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
f060: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
f070: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
f080: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f090: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
f0a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65     }.        pMe
f0b0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
f0c0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
f0d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64       pMem->n = d
f0e0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
f0f0: 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c  p, zP4, pMem->z,
f100: 20 35 30 30 29 3b 0a 20 20 20 20 20 20 20 20 70   500);.        p
f110: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
f120: 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20  E_UTF8;.#else.  
f130: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f140: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
f170: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  /.#endif.      }
f180: 0a 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 73 43  ..      p->nResC
f190: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
f1a0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
f1b0: 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65      p->pResultSe
f1c0: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
f1d0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
f1e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
f1f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
f200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f210: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
f220: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f230: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
f240: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f250: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
f260: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
f270: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
f280: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
f290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
f2a0: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
f2b0: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p){.  const char
f2c0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   *z = 0;.  if( p
f2d0: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20  ->zSql ){.    z 
f2e0: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c  = p->zSql;.  }el
f2f0: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31  se if( p->nOp>=1
f300: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64   ){.    const Vd
f310: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
f320: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[0];.    if( 
f330: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
f340: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
f350: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z!=0 ){.      z 
f360: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
f370: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
f380: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
f390: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
f3a0: 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22  if( z ) printf("
f3b0: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
f3c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
f3d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f3e0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
f3f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
f400: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
f410: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
f420: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
f430: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
f440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f450: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
f460: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
f470: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
f480: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
f490: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
f4a0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
f4b0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
f4c0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
f4d0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
f4e0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
f4f0: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
f500: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
f510: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
f520: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
f530: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
f540: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
f550: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
f560: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
f570: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
f580: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
f590: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
f5a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f5b0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
f5c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
f5d0: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
f5e0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
f5f0: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
f600: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f610: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
f620: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f630: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
f640: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
f650: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
f660: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
f670: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
f680: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
f690: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
f6a0: 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  ./* An instance 
f6b0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64  of this object d
f6c0: 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65  escribes bulk me
f6d0: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
f6e0: 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62  or use.** by sub
f6f0: 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20  components of a 
f700: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
f710: 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c  nt.  Space is al
f720: 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f  located out.** o
f730: 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61 63  f a ReusableSpac
f740: 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20  e object by the 
f750: 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75  allocSpace() rou
f760: 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73  tine below..*/.s
f770: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
f780: 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61  ace {.  u8 *pSpa
f790: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
f7a0: 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  * Available memo
f7b0: 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ry */.  sqlite3_
f7c0: 69 6e 74 36 34 20 6e 46 72 65 65 3b 20 20 20 2f  int64 nFree;   /
f7d0: 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c  * Bytes of avail
f7e0: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  able memory */. 
f7f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
f800: 4e 65 65 64 65 64 3b 20 2f 2a 20 54 6f 74 61 6c  Needed; /* Total
f810: 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c   bytes that coul
f820: 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  d not be allocat
f830: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79  ed */.};../* Try
f840: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79   to allocate nBy
f850: 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79  te bytes of 8-by
f860: 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20  te aligned bulk 
f870: 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a  memory for pBuf.
f880: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73  ** from the Reus
f890: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
f8a0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
f8b0: 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
f8c0: 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f  ated.** memory o
f8d0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69  n success.  If i
f8e0: 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f  nsufficient memo
f8f0: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
f900: 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62  in the.** Reusab
f910: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20  leSpace object, 
f920: 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75  increase the Reu
f930: 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64  sableSpace.nNeed
f940: 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74  ed.** value by t
f950: 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64  he amount needed
f960: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
f970: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20  ..**.** If pBuf 
f980: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79  is not initially
f990: 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e   NULL, that mean
f9a0: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  s that the memor
f9b0: 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  y has already.**
f9c0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
f9d0: 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  by a prior call 
f9e0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  to this routine,
f9f0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
fa00: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75  a copy.** of pBu
fa10: 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73  f and leave Reus
fa20: 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e  ableSpace unchan
fa30: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ged..**.** This 
fa40: 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70  allocator is emp
fa50: 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f  loyed to repurpo
fa60: 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20  se unused slots 
fa70: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
fa80: 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61  e.** opcode arra
fa90: 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  y of prepared st
faa0: 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65  ate for other me
fab0: 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68  mory needs of th
fac0: 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  e prepared.** st
fad0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
fae0: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
faf0: 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65  ace(.  struct Re
fb00: 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20  usableSpace *p, 
fb10: 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20   /* Bulk memory 
fb20: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
fb30: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  location */.  vo
fb40: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
fb50: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
fb60: 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c  er to a prior al
fb70: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  location */.  sq
fb80: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
fb90: 65 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  e       /* Bytes
fba0: 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
fbb0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
fbc0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
fbd0: 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65  GNMENT(p->pSpace
fbe0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  ) );.  if( pBuf=
fbf0: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
fc00: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
fc10: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c  .    if( nByte <
fc20: 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  = p->nFree ){.  
fc30: 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20      p->nFree -= 
fc40: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75  nByte;.      pBu
fc50: 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70  f = &p->pSpace[p
fc60: 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65  ->nFree];.    }e
fc70: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e  lse{.      p->nN
fc80: 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a  eeded += nByte;.
fc90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
fca0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
fcb0: 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29  LIGNMENT(pBuf) )
fcc0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
fcd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64  .}../*.** Rewind
fce0: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74   the VDBE back t
fcf0: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
fd00: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
fd10: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74  or.** running it
fd20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
fd30: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65  3VdbeRewind(Vdbe
fd40: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
fd50: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
fd60: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
fd70: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
fd80: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
fd90: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
fda0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
fdb0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c  DBE_MAGIC_INIT |
fdc0: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
fdd0: 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a  _MAGIC_RESET );.
fde0: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
fdf0: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
fe00: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
fe10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
fe20: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
fe30: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
fe40: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
fe50: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
fe60: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
fe70: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
fe80: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51  _RUN;..#ifdef SQ
fe90: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
fea0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=0; i<p->nMem;
feb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
fec0: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62  t( p->aMem[i].db
fed0: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23  ==p->db );.  }.#
fee0: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20  endif.  p->pc = 
fef0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
ff00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
ff10: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
ff20: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  bort;.  p->nChan
ff30: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
ff40: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
ff50: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
ff60: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
ff70: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
ff80: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
ff90: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
ffa0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72  BE_PROFILE.  for
ffb0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
ffc0: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  i++){.    p->aOp
ffd0: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
ffe0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
fff0: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  s = 0;.  }.#endi
10000 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
10010 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
10020 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
10030 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  on for the first
10040 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63   time after.** c
10050 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74  reating the virt
10060 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68  ual machine.  Th
10070 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
10080 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
10090 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65  locating registe
100a0 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  rs and initializ
100b0 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
100c0 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
100d0 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
100e0 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
100f0 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
10100 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
10110 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
10120 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
10130 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10140 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
10150 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20  exactly once on 
10160 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63  each virtual mac
10170 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74  hine..** After t
10180 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10190 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73  alled the VM has
101a0 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22   been "packaged"
101b0 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a   and is ready.**
101c0 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20   to run.  After 
101d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
101e0 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20  called, further 
101f0 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
10200 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
10210 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
10220 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
10230 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
10240 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
10250 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
10260 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
10270 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
10280 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
10290 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
102a0 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
102b0 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
102c0 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
102d0 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
102e0 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
102f0 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
10300 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
10310 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
10320 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
10330 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
10340 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
10350 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
10360 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
10370 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
10380 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
10390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
103a0 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
103b0 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
103c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
103d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
103e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
103f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10400 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
10410 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
10420 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10450 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
10460 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10480 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
10490 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
104a0 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
104b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
104c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
104d0 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
104e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10510 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
10520 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
10530 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
10560 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73  */.  struct Reus
10570 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20  ableSpace x;    
10580 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20      /* Reusable 
10590 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a  bulk memory */..
105a0 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
105b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
105c0 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
105d0 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
105e0 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
105f0 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
10600 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
10610 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73  pParse==p->pPars
10620 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e );.  db = p->d
10630 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  b;.  assert( db-
10640 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
10650 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61   );.  nVar = pPa
10660 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65  rse->nVar;.  nMe
10670 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
10680 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50  ;.  nCursor = pP
10690 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41  arse->nTab;.  nA
106a0 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61  rg = pParse->nMa
106b0 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61  xArg;.  .  /* Ea
106c0 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61  ch cursor uses a
106d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54   memory cell.  T
106e0 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
106f0 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20  (cursor 0) can. 
10700 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20   ** use aMem[0] 
10710 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68  which is not oth
10720 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74  erwise used by t
10730 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
10740 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20    Allocate.  ** 
10750 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
10760 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63   of aMem[] for c
10770 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65  ursors 1 and gre
10780 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61  ater..  ** See a
10790 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
107a0 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
107b0 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  em += nCursor;. 
107c0 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20   if( nCursor==0 
107d0 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d  && nMem>0 ) nMem
107e0 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f  ++;  /* Space fo
107f0 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69  r aMem[0] even i
10800 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20  f not used */.. 
10810 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
10820 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65  ow much reusable
10830 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
10840 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20  able at the end 
10850 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f  of the.  ** opco
10860 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20  de array.  This 
10870 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c  extra memory wil
10880 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  l be reallocated
10890 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65   for other eleme
108a0 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  nts.  ** of the 
108b0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
108c0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52  nt..  */.  n = R
108d0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29  OUND8(sizeof(Op)
108e0 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20  *p->nOp);       
108f0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
10900 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  of opcode memory
10910 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70   used */.  x.pSp
10920 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e  ace = &((u8*)p->
10930 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20  aOp)[n];        
10940 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
10950 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a   opcode memory *
10960 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  /.  assert( EIGH
10970 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
10980 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20  (x.pSpace) );.  
10990 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44  x.nFree = ROUNDD
109a0 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f  OWN8(pParse->szO
109b0 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a  pAlloc - n);  /*
109c0 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   Bytes of unused
109d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73   memory */.  ass
109e0 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20  ert( x.nFree>=0 
109f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
10a00 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
10a10 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46  T(&x.pSpace[x.nF
10a20 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f  ree]) );..  reso
10a30 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
10a40 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73  nArg);.  p->uses
10a50 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  StmtJournal = (u
10a60 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  8)(pParse->isMul
10a70 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73  tiWrite && pPars
10a80 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20  e->mayAbort);.  
10a90 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10aa0 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29  ain && nMem<10 )
10ab0 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b  {.    nMem = 10;
10ac0 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65  .  }.  p->expire
10ad0 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
10ae0 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
10af0 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
10b00 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
10b10 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20  llocated in one 
10b20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73  or two.  ** pass
10b30 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
10b40 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
10b50 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d  o reuse unused m
10b60 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20  emory at the .  
10b70 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
10b80 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
10b90 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
10ba0 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
10bb0 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
10bc0 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
10bd0 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
10be0 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
10bf0 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
10c00 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
10c10 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69  he remainder usi
10c20 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72  ng a fresh memor
10c30 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  y allocation.  .
10c40 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
10c50 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
10c60 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
10c70 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
10c80 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
10c90 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d  * the leftover m
10ca0 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64  emory at the end
10cb0 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
10cc0 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20  rray.  This can 
10cd0 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
10ce0 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
10cf0 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
10d00 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
10d10 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
10d20 2f 0a 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20  /.  x.nNeeded = 
10d30 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61  0;.  p->aMem = a
10d40 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c  llocSpace(&x, 0,
10d50 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
10d60 29 29 3b 0a 20 20 70 2d 3e 61 56 61 72 20 3d 20  ));.  p->aVar = 
10d70 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30  allocSpace(&x, 0
10d80 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
10d90 6d 29 29 3b 0a 20 20 70 2d 3e 61 70 41 72 67 20  m));.  p->apArg 
10da0 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
10db0 20 30 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28   0, nArg*sizeof(
10dc0 4d 65 6d 2a 29 29 3b 0a 20 20 70 2d 3e 61 70 43  Mem*));.  p->apC
10dd0 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
10de0 26 78 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73  &x, 0, nCursor*s
10df0 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
10e00 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  *));.#ifdef SQLI
10e10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
10e20 43 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61  CANSTATUS.  p->a
10e30 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61  nExec = allocSpa
10e40 63 65 28 26 78 2c 20 30 2c 20 70 2d 3e 6e 4f 70  ce(&x, 0, p->nOp
10e50 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
10e60 65 6e 64 69 66 0a 20 20 69 66 28 20 78 2e 6e 4e  endif.  if( x.nN
10e70 65 65 64 65 64 20 29 7b 0a 20 20 20 20 78 2e 70  eeded ){.    x.p
10e80 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65  Space = p->pFree
10e90 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
10ea0 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e  ocRawNN(db, x.nN
10eb0 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46  eeded);.    x.nF
10ec0 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b  ree = x.nNeeded;
10ed0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
10ee0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
10ef0 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c      p->aMem = al
10f00 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
10f10 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
10f20 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 70  f(Mem));.      p
10f30 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  ->aVar = allocSp
10f40 61 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c  ace(&x, p->aVar,
10f50 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
10f60 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41  ));.      p->apA
10f70 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
10f80 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41  &x, p->apArg, nA
10f90 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29  rg*sizeof(Mem*))
10fa0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
10fb0 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
10fc0 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  , p->apCsr, nCur
10fd0 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
10fe0 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66  ursor*));.#ifdef
10ff0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
11000 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
11010 20 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d       p->anExec =
11020 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
11030 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f  p->anExec, p->nO
11040 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a  p*sizeof(i64));.
11050 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
11060 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20  ..  p->pVList = 
11070 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a  pParse->pVList;.
11080 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74    pParse->pVList
11090 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c   =  0;.  p->expl
110a0 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
110b0 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d  plain;.  if( db-
110c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
110d0 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30  .    p->nVar = 0
110e0 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ;.    p->nCursor
110f0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65   = 0;.    p->nMe
11100 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 0;.  }else{.
11110 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
11120 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d   nCursor;.    p-
11130 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
11140 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d  Var;.    initMem
11150 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e  Array(p->aVar, n
11160 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  Var, db, MEM_Nul
11170 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  l);.    p->nMem 
11180 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74  = nMem;.    init
11190 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
111a0 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f  , nMem, db, MEM_
111b0 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20  Undefined);.    
111c0 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c  memset(p->apCsr,
111d0 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65   0, nCursor*size
111e0 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29  of(VdbeCursor*))
111f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11200 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
11210 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65  STATUS.    memse
11220 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20  t(p->anExec, 0, 
11230 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
11240 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  4));.#endif.  }.
11250 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77    sqlite3VdbeRew
11260 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ind(p);.}../*.**
11270 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
11280 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
11290 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
112a0 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
112b0 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
112c0 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
112d0 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
112e0 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
112f0 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
11300 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
11310 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
11320 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78  ssert( pCx->pBtx
11330 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72  ==0 || pCx->eCur
11340 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
11350 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28  REE );.  switch(
11360 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29   pCx->eCurType )
11370 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  {.    case CURTY
11380 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20  PE_SORTER: {.   
11390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
113a0 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
113b0 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65   pCx);.      bre
113c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
113d0 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  se CURTYPE_BTREE
113e0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  : {.      if( pC
113f0 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29  x->isEphemeral )
11400 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  {.        if( pC
11410 78 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65  x->pBtx ) sqlite
11420 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
11430 3e 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20  >pBtx);.        
11440 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
11450 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
11460 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
11470 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
11480 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  y.        ** the
11490 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
114a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
114b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78       assert( pCx
114c0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
114d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
114e0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
114f0 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  or(pCx->uc.pCurs
11500 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
11510 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11530 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11540 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
11550 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  E_VTAB: {.      
11560 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
11570 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78  sor *pVCur = pCx
11580 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20  ->uc.pVCur;.    
11590 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
115a0 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
115b0 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e  = pVCur->pVtab->
115c0 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61  pModule;.      a
115d0 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56  ssert( pVCur->pV
115e0 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  tab->nRef>0 );. 
115f0 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61       pVCur->pVta
11600 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  b->nRef--;.     
11610 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
11620 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62  (pVCur);.      b
11630 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
11640 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
11650 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
11660 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
11670 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
11680 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73  c void closeCurs
11690 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20  orsInFrame(Vdbe 
116a0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
116b0 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
116c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
116d0 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
116e0 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
116f0 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
11700 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
11710 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
11720 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
11730 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
11740 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
11750 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
11760 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11770 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
11780 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
11790 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
117a0 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
117b0 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
117c0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
117d0 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
117e0 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
117f0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
11800 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
11810 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
11820 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11830 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
11840 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
11850 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
11860 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43  ame->v;.  closeC
11870 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29  ursorsInFrame(v)
11880 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11890 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
118a0 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
118b0 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
118c0 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
118d0 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
118e0 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
118f0 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
11900 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
11910 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
11920 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
11930 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
11940 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
11950 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
11960 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
11970 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
11980 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
11990 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
119a0 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
119b0 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68  ge;.  v->db->nCh
119c0 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
119d0 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69  DbChange;.  sqli
119e0 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
119f0 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e  Data(v->db, &v->
11a00 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
11a10 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20  ;.  v->pAuxData 
11a20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61  = pFrame->pAuxDa
11a30 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41  ta;.  pFrame->pA
11a40 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65  uxData = 0;.  re
11a50 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
11a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
11a70 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
11a80 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
11a90 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
11aa0 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
11ab0 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
11ac0 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
11ad0 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
11ae0 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
11af0 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
11b00 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
11b10 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
11b20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
11b30 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
11b40 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
11b50 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
11b60 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
11b70 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
11b80 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
11b90 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
11ba0 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
11bb0 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
11bc0 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
11bd0 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
11be0 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
11bf0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
11c00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11c10 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
11c20 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72  ame);.    p->pFr
11c30 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ame = 0;.    p->
11c40 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  nFrame = 0;.  }.
11c50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
11c60 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73  ame==0 );.  clos
11c70 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
11c80 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  p);.  if( p->aMe
11c90 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
11ca0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
11cb0 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
11cc0 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
11cd0 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
11ce0 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
11cf0 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
11d00 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
11d10 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
11d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
11d30 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
11d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
11d50 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c  e any auxdata al
11d60 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
11d70 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66  y the VM */.  if
11d80 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20  ( p->pAuxData ) 
11d90 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
11da0 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20  eAuxData(p->db, 
11db0 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &p->pAuxData, -1
11dc0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
11dd0 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  p->pAuxData==0 )
11de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11df0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
11e00 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
11e10 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
11e20 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
11e30 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
11e40 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
11e50 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
11e60 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
11e70 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
11e80 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
11e90 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
11ea0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
11eb0 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
11ec0 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
11ed0 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
11ee0 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
11ef0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
11f00 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
11f10 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
11f20 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  n){.  int n;.  s
11f30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
11f40 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52  db;..  if( p->nR
11f50 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  esColumn ){.    
11f60 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
11f70 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
11f80 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
11f90 4d 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74  ME_N);.    sqlit
11fa0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
11fb0 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  aColName);.  }. 
11fc0 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
11fd0 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
11fe0 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
11ff0 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
12000 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d  p->aColName = (M
12010 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
12020 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
12030 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
12040 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
12050 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
12060 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  nitMemArray(p->a
12070 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20  ColName, n, db, 
12080 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  MEM_Null);.}../*
12090 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
120a0 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
120b0 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
120c0 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
120d0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
120e0 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
120f0 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
12100 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
12110 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
12120 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
12130 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
12140 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
12150 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
12160 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
12170 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
12180 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
12190 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
121a0 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
121b0 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
121c0 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
121d0 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
121e0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
121f0 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
12200 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
12210 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
12220 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
12230 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
12240 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
12250 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
12260 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
12280 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
12290 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
122a0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
122b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
122c0 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
122d0 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
122e0 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
12310 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
12320 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
12330 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12350 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
12360 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
12370 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
12380 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
12390 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
123a0 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
123b0 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
123c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
123d0 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
123e0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
123f0 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
12400 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
12410 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
12420 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
12430 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
12440 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
12450 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
12460 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
12470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
12480 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
12490 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
124a0 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
124b0 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
124c0 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
124d0 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
124e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
124f0 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
12500 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
12510 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
12520 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
12530 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
12540 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
12550 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
12560 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12570 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
12580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
12590 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
125a0 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
125b0 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
125c0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
125d0 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
125e0 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
125f0 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
12600 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
12610 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
12620 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
12630 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
12640 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
12650 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12660 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
12670 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
12680 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
12690 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
126a0 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
126b0 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
126c0 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
126d0 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
126e0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te-transaction. 
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12700 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61    ** that are ca
12710 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74  ndidates for a t
12720 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20  wo-phase commit 
12730 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20  using a.        
12740 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61             ** ma
12750 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster-journal */.
12760 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12770 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
12780 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
12790 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
127a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
127b0 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
127c0 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
127d0 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
127e0 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
127f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
12800 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
12810 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
12820 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
12830 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
12840 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
12850 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
12860 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
12870 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
12880 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
12890 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
128a0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
128b0 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
128c0 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
128d0 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
128e0 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
128f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
12900 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
12910 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
12920 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
12930 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
12940 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
12950 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
12960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
12970 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a  abSync(db, p);..
12980 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
12990 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
129a0 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
129b0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
129c0 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
129d0 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
129e0 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
129f0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
12a00 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
12a10 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
12a20 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
12a30 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
12a40 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
12a50 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
12a60 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
12a70 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
12a80 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
12a90 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
12aa0 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
12ab0 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
12ac0 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
12ad0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
12ae0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
12af0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
12b00 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
12b10 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
12b20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
12b30 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
12b40 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  {.      /* Wheth
12b50 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61  er or not a data
12b60 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20  base might need 
12b70 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
12b80 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20   depends upon.  
12b90 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e      ** its journ
12ba0 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f  al mode (among o
12bb0 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54  ther things).  T
12bc0 68 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72  his matrix deter
12bd0 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20  mines which.    
12be0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64    ** journal mod
12bf0 65 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20  es use a master 
12c00 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63  journal and whic
12c10 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20  h do not */.    
12c20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
12c30 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20  8 aMJNeeded[] = 
12c40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c  {.        /* DEL
12c50 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20  ETE   */  1,.   
12c60 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20       /* PERSIST 
12c70 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20    */ 1,.        
12c80 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20  /* OFF       */ 
12c90 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52  0,.        /* TR
12ca0 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20  UNCATE  */ 1,.  
12cb0 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20        /* MEMORY 
12cc0 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20     */ 0,.       
12cd0 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f   /* WAL       */
12ce0 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
12cf0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
12d00 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f     /* Pager asso
12d10 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20  ciated with pBt 
12d20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  */.      needXco
12d30 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
12d40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12d50 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50  r(pBt);.      pP
12d60 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
12d70 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20  reePager(pBt);. 
12d80 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62       if( db->aDb
12d90 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [i].safety_level
12da0 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  !=PAGER_SYNCHRON
12db0 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26  OUS_OFF.       &
12dc0 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69  & aMJNeeded[sqli
12dd0 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e  te3PagerGetJourn
12de0 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a  alMode(pPager)].
12df0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
12e00 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50  3PagerIsMemdb(pP
12e10 61 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29  ager)==0.      )
12e20 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  { .        asser
12e30 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20  t( i!=1 );.     
12e40 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20     nTrans++;.   
12e50 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
12e60 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
12e70 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
12e80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12e90 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
12ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12ec0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12ed0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
12ee0 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
12ef0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
12f00 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
12f10 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
12f20 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
12f30 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
12f40 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
12f50 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
12f60 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
12f70 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
12f80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
12f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
12fa0 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
12fb0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
12fc0 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
12fd0 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
12fe0 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
12ff0 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
13000 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
13010 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
13020 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
13030 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
13040 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
13050 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
13060 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
13070 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
13080 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
13090 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
130a0 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
130b0 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
130c0 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
130d0 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
130e0 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
130f0 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
13100 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
13110 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
13120 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
13130 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
13140 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
13150 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
13160 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
13170 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
13180 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
13190 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
131a0 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
131b0 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
131c0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
131d0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
131e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
131f0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
13200 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
13210 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
13220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13230 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
13240 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
13250 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
13260 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
13270 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
13280 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
13290 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
132a0 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
132b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
132c0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
132d0 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
132e0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
132f0 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
13300 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
13310 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
13320 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
13330 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
13340 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
13350 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
13360 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
13370 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
13380 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
13390 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
133a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
133b0 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
133c0 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
133d0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
133e0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
133f0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
13400 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13410 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
13420 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
13430 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
13440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13450 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
13460 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
13470 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
13480 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
13490 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
134a0 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
134b0 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
134c0 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
134d0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
134e0 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
134f0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
13500 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
13510 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ted atomically..
13520 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
13530 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
13540 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
13550 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
13560 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68  db->pVfs;.    ch
13570 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
13580 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
13590 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
135a0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
135b0 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
135c0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
135d0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
135e0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
135f0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
13600 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
13610 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
13620 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
13630 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
13640 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
13650 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
13660 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
13670 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
13680 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
13690 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
136a0 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
136b0 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
136c0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
136d0 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
136e0 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
136f0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
13700 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
13710 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13720 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
13730 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
13740 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
13750 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
13760 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
13770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13780 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
13790 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
137a0 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
137b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
137c0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
137d0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
137e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
137f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13800 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
13810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13820 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
13830 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
13840 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
13850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13860 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
13870 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
13880 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
13890 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
138a0 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
138b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
138c0 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
138d0 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
138e0 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
13910 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
13920 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
13930 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
13940 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
13950 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
13960 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
13970 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
13980 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
13990 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
139a0 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
139b0 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
139c0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
139d0 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
139e0 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
139f0 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
13a00 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
13a10 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
13a20 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
13a30 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
13a40 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
13a50 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
13a60 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
13a70 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
13a80 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
13a90 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ab0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
13ac0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
13ad0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13ae0 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
13af0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
13b00 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
13b10 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
13b20 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
13b30 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
13b40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13b50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
13b60 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
13b70 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
13b80 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
13b90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13ba0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13bb0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
13bc0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
13bd0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
13be0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
13bf0 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
13c00 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
13c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
13c20 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
13c30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13c40 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
13c50 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
13c60 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
13c70 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
13c80 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13c90 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
13ca0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
13cb0 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
13cc0 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
13cd0 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
13ce0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
13cf0 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
13d00 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
13d10 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
13d20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
13d30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
13d40 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
13d50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
13d60 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
13d70 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
13d80 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
13d90 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
13da0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
13db0 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
13dc0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
13dd0 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
13de0 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
13df0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13e00 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
13e10 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
13e20 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
13e30 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
13e40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
13e50 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
13e60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13e70 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
13e80 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
13e90 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
13ea0 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
13eb0 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
13ec0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13ed0 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
13ee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13ef0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13f00 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
13f10 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
13f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
13f30 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
13f40 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
13f50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13f60 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
13f70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13f80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
13f90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
13fa0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
13fb0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13fc0 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
13fd0 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
13fe0 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
13ff0 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
14000 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
14010 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71  /.    if( 0==(sq
14020 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
14030 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
14040 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
14050 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
14060 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
14070 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
14080 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
14090 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
140a0 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
140b0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
140c0 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
140d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
140e0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
140f0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
14100 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
14110 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
14120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
14130 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
14140 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
14150 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
14160 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
14170 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
14180 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
14190 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
141a0 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
141b0 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
141c0 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
141d0 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
141e0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
141f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14200 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
14210 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
14220 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
14230 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
14240 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
14250 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
14260 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
14270 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
14280 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
14290 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
142a0 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
142b0 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
142c0 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
142d0 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
142e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
142f0 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
14300 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
14310 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
14320 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
14330 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
14340 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
14350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14360 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
14370 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
14380 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
14390 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
143a0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
143b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
143c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
143d0 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
143e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
143f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
14400 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
14410 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
14420 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
14430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14440 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14450 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
14460 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
14470 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
14480 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
14490 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
144a0 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
144b0 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
144c0 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
144d0 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
144e0 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
144f0 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
14500 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
14510 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
14520 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
14530 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
14540 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
14550 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
14560 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
14570 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
14580 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
14590 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
145a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
145b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
145c0 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
145d0 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
145e0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
145f0 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
14600 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
14610 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
14620 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
14630 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
14640 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
14650 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
14660 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
14670 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
14680 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
14690 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
146a0 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
146b0 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
146c0 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
146d0 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
146e0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
146f0 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
14700 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
14710 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
14720 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
14730 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
14740 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
14750 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
14760 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
14770 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
14780 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
14790 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
147a0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
147b0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
147c0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
147d0 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
147e0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
147f0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
14800 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
14810 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
14820 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
14830 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
14840 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14850 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14860 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
14870 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
14880 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
14890 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
148a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
148b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
148c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
148d0 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
148e0 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
148f0 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
14900 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
14910 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
14920 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
14930 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
14940 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
14950 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
14960 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
14970 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
14980 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
14990 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
149a0 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
149b0 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
149c0 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
149d0 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
149e0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
149f0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
14a00 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
14a10 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
14a20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
14a30 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
14a40 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
14a50 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
14a60 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
14a70 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
14a80 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
14a90 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
14aa0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
14ab0 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
14ac0 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
14ad0 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
14ae0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
14af0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
14b00 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
14b10 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
14b20 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
14b30 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
14b40 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
14b50 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
14b60 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
14b70 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
14b80 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
14b90 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
14ba0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
14bb0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
14bc0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
14bd0 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
14be0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
14bf0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
14c00 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
14c10 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
14c20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
14c30 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
14c40 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
14c50 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
14c60 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
14c70 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
14c80 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
14c90 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14ca0 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
14cb0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
14cc0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
14cd0 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
14ce0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14cf0 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
14d00 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14d10 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
14d20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
14d30 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
14d40 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
14d50 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
14d60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
14d70 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
14d80 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
14d90 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
14da0 69 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61  int vdbeCloseSta
14db0 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
14dc0 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
14dd0 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
14de0 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
14df0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14e00 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  nt i;.  const in
14e10 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
14e20 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
14e30 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d  .  assert( eOp==
14e40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14e50 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
14e60 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
14e70 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
14e80 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
14e90 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
14ea0 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
14eb0 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
14ec0 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28  oint) );..  for(
14ed0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
14ee0 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72  i++){ .    int r
14ef0 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
14f00 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
14f10 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
14f20 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a  .    if( pBt ){.
14f30 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
14f40 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14f50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32  K ){.        rc2
14f60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
14f70 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
14f80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14f90 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
14fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14fb0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
14fc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
14fd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
14fe0 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
14ff0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
15000 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
15010 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
15020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15030 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
15040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15050 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d   }.  db->nStatem
15060 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61  ent--;.  p->iSta
15070 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69  tement = 0;..  i
15080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15090 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   ){.    if( eOp=
150a0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
150b0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
150c0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
150d0 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
150e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
150f0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
15100 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
15110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
15130 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
15140 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
15150 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
15160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15170 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
15180 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
15190 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
151a0 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
151b0 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
151c0 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
151d0 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
151e0 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
151f0 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
15200 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
15210 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
15220 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
15230 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
15240 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
15250 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
15260 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
15270 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d  DefCons;.    db-
15280 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
15290 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
152a0 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65  mmCons;.  }.  re
152b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
152c0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
152d0 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
152e0 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66  , int eOp){.  if
152f0 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d  ( p->db->nStatem
15300 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
15310 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75  ment ){.    retu
15320 72 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  rn vdbeCloseStat
15330 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20  ement(p, eOp);. 
15340 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15350 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
15360 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15370 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
15380 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
15390 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
153a0 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
153b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
153c0 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
153d0 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
153e0 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
153f0 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
15400 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
15410 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
15420 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
15430 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
15440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15450 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
15460 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
15470 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
15480 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
15490 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
154a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
154b0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
154c0 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
154d0 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
154e0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
154f0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
15500 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
15510 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
15520 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
15530 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
15540 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15550 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
15560 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
15570 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
15580 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
15590 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
155a0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
155b0 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
155c0 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
155d0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
155e0 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
155f0 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
15600 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
15610 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
15620 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
15630 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
15640 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
15650 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
15660 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
15670 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45  r(p, "FOREIGN KE
15680 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
15690 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
156a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
156b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
156c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
156d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
156e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
156f0 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
15700 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
15710 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
15720 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
15730 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
15740 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
15750 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
15760 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
15770 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
15780 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
15790 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
157a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
157b0 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
157c0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
157d0 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
157e0 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
157f0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
15800 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
15810 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
15820 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
15830 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
15840 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
15850 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
15860 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
15870 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
15880 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
15890 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
158a0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
158b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
158c0 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
158d0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
158e0 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
158f0 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
15900 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
15910 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
15920 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15930 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
15940 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
15970 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
15980 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
15990 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
159a0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
159b0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
159c0 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
159d0 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
159e0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
159f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
15a00 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
15a10 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
15a20 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15a30 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
15a40 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
15a50 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
15a60 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
15a70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
15a80 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
15a90 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
15aa0 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
15ab0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
15ac0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
15ad0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
15ae0 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
15af0 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
15b00 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
15b10 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
15b20 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
15b30 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
15b40 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
15b50 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
15b60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
15b70 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
15b80 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
15b90 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
15ba0 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
15bb0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
15bc0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
15bd0 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
15be0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
15bf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15c00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
15c10 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
15c20 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
15c30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
15c40 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  BKPT;.  }.  clos
15c50 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
15c60 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
15c70 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
15c80 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
15c90 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
15ca0 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
15cb0 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
15cc0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
15cd0 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
15ce0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
15cf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
15d00 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
15d10 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
15d20 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
15d30 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
15d40 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
15d50 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
15d60 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
15d70 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
15d80 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
15d90 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
15da0 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
15db0 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
15dc0 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
15dd0 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
15de0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
15df0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
15e00 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
15e10 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
15e20 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
15e30 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
15e40 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
15e50 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
15e60 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
15e70 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
15e80 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
15ea0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
15eb0 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
15ec0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
15ed0 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
15ee0 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
15ef0 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
15f00 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
15f10 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
15f20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
15f30 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
15f40 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
15f50 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
15f60 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
15f70 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
15f80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
15f90 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
15fa0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
15fb0 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
15fc0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
15fd0 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
15fe0 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
15ff0 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
16000 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
16010 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
16020 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
16030 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
16040 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
16050 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
16060 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
16070 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
16080 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
16090 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
160a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
160b0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
160c0 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
160d0 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
160e0 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
160f0 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
16100 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
16110 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
16120 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
16130 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
16140 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
16150 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
16160 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
16170 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
16180 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
16190 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
161a0 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
161b0 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
161c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
161d0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
161e0 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
161f0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
16200 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
16210 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
16220 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
16230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16240 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
16250 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
16260 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
16270 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
16280 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
16290 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
162a0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
162b0 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
162c0 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
162d0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
162e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
162f0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
16300 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
16310 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
16320 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
16330 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
16340 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
16350 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
16360 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
16370 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
16380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16390 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
163a0 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
163b0 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
163c0 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
163d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
163e0 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
163f0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
16400 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
16410 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
16420 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
16430 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
16440 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
16450 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
16460 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
16470 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
16480 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
16490 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
164a0 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
164b0 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
164c0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
164d0 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
164e0 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
164f0 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
16500 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
16510 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
16520 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
16530 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
16540 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
16550 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
16560 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
16570 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
16580 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
16590 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
165a0 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
165b0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
165c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
165d0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
165e0 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
165f0 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
16600 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16610 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
16620 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16630 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
16650 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
16660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
16670 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
16680 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
16690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
166a0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
166b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
166c0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
166d0 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
166e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
166f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16700 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
16710 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
16720 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
16730 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
16740 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
16750 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
16760 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
16770 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
16780 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
16790 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
167a0 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
167b0 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
167c0 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
167d0 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
167e0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
167f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
16800 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
16810 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
16820 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
16830 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
16840 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
16850 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16860 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
16870 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16880 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
16890 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
168a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
168b0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
168c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
168d0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
168e0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
168f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
16900 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
16910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16920 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
16930 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
16940 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
16950 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
16960 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
16970 61 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c  ags &= ~(u64)SQL
16980 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20  ITE_DeferFKs;.  
16990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
169a0 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
169b0 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
169c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
169d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
169e0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
169f0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
16a00 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
16a10 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16a20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
16a30 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
16a40 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
16a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
16a60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16a70 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
16a80 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
16a90 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
16aa0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
16ab0 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
16ac0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
16ad0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
16ae0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
16af0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
16b00 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
16b10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
16b30 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
16b40 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
16b50 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
16b60 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
16b70 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
16b80 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
16b90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
16ba0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
16bb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
16bc0 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
16bd0 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
16be0 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
16bf0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
16c00 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
16c10 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
16c20 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
16c30 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
16c40 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
16c50 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
16c60 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
16c70 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
16c80 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
16c90 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
16ca0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
16cb0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
16cc0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
16cd0 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
16ce0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
16cf0 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
16d00 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
16d10 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
16d20 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
16d30 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
16d40 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
16d50 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
16d60 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16d70 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16d80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
16d90 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
16da0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
16db0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
16dc0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
16dd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16de0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
16df0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
16e00 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
16e10 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
16e20 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
16e30 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
16e40 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
16e50 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
16e60 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
16e70 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
16e80 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
16e90 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
16ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16eb0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
16ec0 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
16ed0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
16ee0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
16ef0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
16f00 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
16f10 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
16f20 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
16f30 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
16f40 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
16f50 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
16f60 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
16f70 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
16f80 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
16f90 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
16fa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
16fb0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
16fc0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
16fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
16fe0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
16ff0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
17000 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
17010 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
17020 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
17030 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
17040 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
17050 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
17060 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
17070 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
17080 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
17090 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
170a0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
170b0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
170c0 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
170d0 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
170e0 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
170f0 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
17100 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
17110 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
17120 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
17130 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
17140 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
17150 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
17160 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
17170 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
17180 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
17190 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
171a0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
171b0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
171c0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
171d0 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62  nt(db);.  if( db
171e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
171f0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
17200 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
17210 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17220 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
17230 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
17240 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
17250 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
17260 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
17270 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
17280 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
17290 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
172a0 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
172b0 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
172c0 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
172d0 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
172e0 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
172f0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
17300 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
17310 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
17320 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
17330 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
17340 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  tive>0 || db->au
17350 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
17360 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
17370 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
17380 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
17390 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
173a0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
173b0 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
173c0 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
173d0 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
173e0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
173f0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
17400 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
17410 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
17420 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
17430 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
17440 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
17450 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
17460 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
17470 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17480 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f  ** Copy the erro
17490 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
174a0 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69   message belongi
174b0 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70  ng to the VDBE p
174c0 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
174d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
174e0 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68  o its database h
174f0 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74  andle (so that t
17500 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  hey will be .** 
17510 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c  returned by call
17520 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72  s to sqlite3_err
17530 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74  code() and sqlit
17540 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a  e3_errmsg())..**
17550 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17560 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72  n does not clear
17570 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20   the VDBE error 
17580 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c  code or message,
17590 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20   just.** copies 
175a0 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61  them to the data
175b0 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
175c0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54  int sqlite3VdbeT
175d0 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62  ransferError(Vdb
175e0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
175f0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
17600 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
17610 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
17620 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e   ){.    db->bBen
17630 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20  ignMalloc++;.   
17640 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
17650 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
17660 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30   if( db->pErr==0
17670 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71   ) db->pErr = sq
17680 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
17690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
176a0 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
176b0 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
176c0 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
176d0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
176e0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  T);.    sqlite3E
176f0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
17700 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  ;.    db->bBenig
17710 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c  nMalloc--;.  }el
17720 73 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20  se if( db->pErr 
17730 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
17740 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70  lueSetNull(db->p
17750 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Err);.  }.  db->
17760 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
17770 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
17780 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17790 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20  LE_SQLLOG./*.** 
177a0 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  If an SQLITE_CON
177b0 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20  FIG_SQLLOG hook 
177c0 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e  is registered an
177d0 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
177e0 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b  n run, .** invok
177f0 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
17800 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53  void vdbeInvokeS
17810 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a  qllog(Vdbe *v){.
17820 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
17830 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
17840 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49  g && v->rc==SQLI
17850 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c  TE_OK && v->zSql
17860 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && v->pc>=0 ){.
17870 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e      char *zExpan
17880 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ded = sqlite3Vdb
17890 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d  eExpandSql(v, v-
178a0 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65  >zSql);.    asse
178b0 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e  rt( v->db->init.
178c0 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69  busy==0 );.    i
178d0 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a  f( zExpanded ){.
178e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
178f0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
17900 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g(.          sql
17910 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17920 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e  .pSqllogArg, v->
17930 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31  db, zExpanded, 1
17940 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
17950 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
17960 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b  >db, zExpanded);
17970 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
17980 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
17990 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a  InvokeSqllog(x).
179a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
179b0 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
179c0 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
179d0 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
179e0 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
179f0 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
17a00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
17a10 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
17a20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
17a30 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
17a40 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
17a50 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
17a60 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
17a70 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
17a80 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
17a90 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
17aa0 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
17ab0 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
17ac0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
17ad0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
17ae0 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
17af0 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
17b00 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
17b10 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
17b20 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
17b30 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
17b40 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
17b50 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
17b60 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
17b70 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
17b80 74 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  t i;.#endif..  s
17b90 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
17ba0 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
17bb0 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
17bc0 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
17bd0 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
17be0 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
17bf0 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
17c00 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
17c10 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
17c20 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
17c30 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
17c40 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
17c50 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
17c60 68 65 20 56 44 42 45 20 68 61 73 20 62 65 65 6e  he VDBE has been
17c70 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
17c80 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
17c90 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
17ca0 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
17cb0 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
17cc0 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
17cd0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
17ce0 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
17cf0 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
17d00 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
17d10 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
17d20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
17d30 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
17d40 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
17d50 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
17d60 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
17d70 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
17d80 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
17d90 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
17da0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
17db0 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g(p);.    sqlite
17dc0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
17dd0 6f 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  or(p);.    if( p
17de0 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20  ->runOnlyOnce ) 
17df0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
17e00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
17e10 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
17e20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
17e30 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
17e40 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
17e50 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
17e60 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
17e70 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
17e80 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
17e90 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
17ea0 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
17eb0 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
17ec0 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
17ed0 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
17ee0 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
17ef0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
17f00 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20  hMsg(db, p->rc, 
17f10 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  p->zErrMsg ? "%s
17f20 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73  " : 0, p->zErrMs
17f30 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  g);.  }..  /* Re
17f40 73 65 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e  set register con
17f50 74 65 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69  tents and reclai
17f60 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  m error message 
17f70 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  memory..  */.#if
17f80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17f90 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
17fa0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
17fb0 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
17fc0 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
17fd0 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
17fe0 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
17ff0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
18000 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
18010 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
18020 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
18030 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
18040 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
18050 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
18060 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
18070 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=0; i<p->nMem;
18080 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
18090 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d  >aMem[i].flags==
180a0 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b  MEM_Undefined );
180b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
180c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
180d0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
180e0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
180f0 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
18100 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
18110 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72  E_DEBUG.  p->nWr
18120 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
18130 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
18140 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
18150 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
18160 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
18170 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
18180 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
18190 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
181a0 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
181b0 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
181c0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
181d0 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
181e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
181f0 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
18200 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
18210 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
18220 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
18230 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
18240 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
18250 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c       if( p->zSql
18260 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
18270 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20   c, pc = 0;.    
18280 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18290 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
182a0 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70   for(i=0; (c = p
182b0 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69  ->zSql[i])!=0; i
182c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
182d0 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70  f( pc=='\n' ) fp
182e0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
182f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
18300 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(c, out);.     
18310 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
18320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
18330 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70  f( pc!='\n' ) fp
18340 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
18350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18360 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
18370 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
18380 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b   char zHdr[100];
18390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
183a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
183b0 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25  (zHdr), zHdr, "%
183c0 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20  6u %12llu %8llu 
183d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
183e0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
183f0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
18400 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
18410 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
18420 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
18430 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
18440 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
18450 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72    );.        fpr
18460 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
18470 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73  zHdr);.        s
18480 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
18490 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
184a0 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
184b0 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
184c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
184d0 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
184e0 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54  VDBE_MAGIC_RESET
184f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
18500 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
18510 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
18520 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
18530 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
18540 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
18550 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
18560 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
18570 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
18580 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
18590 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
185a0 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
185b0 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
185c0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
185d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
185e0 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
185f0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
18600 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
18610 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
18620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
18630 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
18640 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
18650 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
18660 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
18670 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
18680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18690 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
186a0 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
186b0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
186c0 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
186d0 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
186e0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
186f0 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
18700 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
18710 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
18720 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
18730 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
18740 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
18750 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
18760 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
18770 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
18780 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
18790 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
187a0 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
187b0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
187c0 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
187d0 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
187e0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
187f0 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
18800 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
18810 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
18820 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
18830 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
18840 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
18850 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
18860 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
18870 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
18880 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
18890 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
188a0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
188b0 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
188c0 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
188d0 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
188e0 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
188f0 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
18900 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  responds to bit 
18910 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
18920 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
18930 74 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65  teAuxData(sqlite
18940 33 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a  3 *db, AuxData *
18950 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  *pp, int iOp, in
18960 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65  t mask){.  while
18970 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78  ( *pp ){.    Aux
18980 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70  Data *pAux = *pp
18990 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30  ;.    if( (iOp<0
189a0 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d  ).     || (pAux-
189b0 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20  >iAuxOp==iOp.   
189c0 20 20 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e         && pAux->
189d0 69 41 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20  iAuxArg>=0.     
189e0 20 20 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69       && (pAux->i
189f0 41 75 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d  AuxArg>31 || !(m
18a00 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28  ask & MASKBIT32(
18a10 70 41 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29  pAux->iAuxArg)))
18a20 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
18a30 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
18a40 41 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20  AuxArg==31 );.  
18a50 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
18a60 65 6c 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20  eleteAux ){.    
18a70 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
18a80 65 41 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29  eAux(pAux->pAux)
18a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18aa0 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78  *pp = pAux->pNex
18ab0 74 41 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69  tAux;.      sqli
18ac0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41  te3DbFree(db, pA
18ad0 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ux);.    }else{.
18ae0 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d        pp= &pAux-
18af0 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d  >pNextAux;.    }
18b00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
18b10 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
18b20 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
18b30 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
18b40 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
18b50 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20  ment,.** except 
18b60 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  for object itsel
18b70 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73  f, which is pres
18b80 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erved..**.** The
18b90 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
18ba0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
18bb0 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
18bc0 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
18bd0 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
18be0 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
18bf0 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
18c00 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
18c10 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
18c20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
18c30 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  nection and free
18c40 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73  s the object its
18c50 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  elf..*/.void sql
18c60 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
18c70 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
18c80 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62   Vdbe *p){.  Sub
18c90 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a  Program *pSub, *
18ca0 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28  pNext;.  assert(
18cb0 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
18cc0 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
18cd0 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
18ce0 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
18cf0 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
18d00 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d  );.  for(pSub=p-
18d10 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b  >pProgram; pSub;
18d20 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20   pSub=pNext){.  
18d30 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e    pNext = pSub->
18d40 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46  pNext;.    vdbeF
18d50 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
18d60 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e  Sub->aOp, pSub->
18d70 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nOp);.    sqlite
18d80 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
18d90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
18da0 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
18db0 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65  C_INIT ){.    re
18dc0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
18dd0 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
18de0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18df0 65 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74  ee(db, p->pVList
18e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
18e10 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
18e20 65 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72  e);.  }.  vdbeFr
18e30 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d  eeOpArray(db, p-
18e40 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  >aOp, p->nOp);. 
18e50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18e60 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
18e70 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
18e80 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23  (db, p->zSql);.#
18e90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18ea0 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20  BLE_NORMALIZE.  
18eb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18ec0 2c 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a  , p->zNormSql);.
18ed0 20 20 7b 0a 20 20 20 20 44 62 6c 71 75 6f 74 65    {.    Dblquote
18ee0 53 74 72 20 2a 70 54 68 69 73 2c 20 2a 70 4e 65  Str *pThis, *pNe
18ef0 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 54 68 69  xt;.    for(pThi
18f00 73 3d 70 2d 3e 70 44 62 6c 53 74 72 3b 20 70 54  s=p->pDblStr; pT
18f10 68 69 73 3b 20 70 54 68 69 73 3d 70 4e 65 78 74  his; pThis=pNext
18f20 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
18f30 20 70 54 68 69 73 2d 3e 70 4e 65 78 74 53 74 72   pThis->pNextStr
18f40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
18f50 62 46 72 65 65 28 64 62 2c 20 70 54 68 69 73 29  bFree(db, pThis)
18f60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
18f70 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
18f80 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
18f90 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20  NSTATUS.  {.    
18fa0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
18fb0 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
18fc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
18fd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18fe0 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  >aScan[i].zName)
18ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19000 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
19010 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e  >aScan);.  }.#en
19020 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  dif.}../*.** Del
19030 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
19040 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
19050 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
19060 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
19070 33 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  3 *db;..  assert
19080 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
19090 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
190a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
190b0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
190c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
190d0 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
190e0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
190f0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
19100 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
19110 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
19120 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
19130 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
19140 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
19150 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
19160 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
19170 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
19180 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
19190 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
191a0 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
191b0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
191c0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
191d0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
191e0 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20   cursor "p" has 
191f0 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f  a pending seek o
19200 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61  peration that ha
19210 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
19220 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20  * carried out.  
19230 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20  Seek the cursor 
19240 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  now.  If an erro
19250 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
19260 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
19270 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
19280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
19290 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
192a0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
192b0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
192c0 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63  ){.  int res, rc
192d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
192e0 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
192f0 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
19300 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
19310 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65   assert( p->defe
19320 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20  rredMoveto );.  
19330 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
19340 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
19350 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
19360 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
19370 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
19380 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
19390 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  p->uc.pCursor, 0
193a0 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
193b0 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  t, 0, &res);.  i
193c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
193d0 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  c;.  if( res!=0 
193e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
193f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69  CORRUPT_BKPT;.#i
19400 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
19410 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
19420 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
19430 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
19440 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
19450 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
19460 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
19470 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19480 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
19490 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
194a0 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
194b0 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
194c0 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
194d0 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
194e0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
194f0 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
19500 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
19510 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
19520 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
19530 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
19540 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
19550 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
19560 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
19570 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
19580 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
19590 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
195a0 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
195b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
195c0 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
195d0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
195e0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
195f0 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
19600 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
19610 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
19620 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
19630 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
19640 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
19650 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
19660 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
19670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
19680 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
19690 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
196a0 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d  ursor) );.  rc =
196b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
196c0 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63  sorRestore(p->uc
196d0 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66  .pCursor, &isDif
196e0 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d  ferentRow);.  p-
196f0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
19700 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
19710 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  ( isDifferentRow
19720 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20   ) p->nullRow = 
19730 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
19740 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
19750 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
19760 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
19770 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20  d.  Restore the 
19780 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65  cursor.** if nee
19790 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e  d be.  Return an
197a0 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d  y I/O error from
197b0 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65   the restore ope
197c0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
197d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
197e0 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73  Restore(VdbeCurs
197f0 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  or *p){.  assert
19800 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
19810 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
19820 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
19830 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
19840 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
19850 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
19860 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
19870 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
19880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19890 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
198a0 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
198b0 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
198c0 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
198d0 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
198e0 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
198f0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
19900 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
19910 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
19920 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
19930 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
19940 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
19950 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
19960 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
19970 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
19980 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
19990 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
199a0 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
199b0 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
199c0 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
199d0 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
199e0 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
199f0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
19a00 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
19a10 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
19a20 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
19a30 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
19a40 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
19a50 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
19a60 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
19a70 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
19a80 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
19a90 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
19aa0 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
19ab0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
19ac0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
19ad0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
19ae0 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
19af0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
19b00 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
19b10 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c  **pp, int *piCol
19b20 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  ){.  VdbeCursor 
19b30 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65  *p = *pp;.  asse
19b40 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
19b50 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c  =CURTYPE_BTREE |
19b60 7c 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  | p->eCurType==C
19b70 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b  URTYPE_PSEUDO );
19b80 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
19b90 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
19ba0 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66  int iMap;.    if
19bb0 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20  ( p->aAltMap && 
19bc0 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d  (iMap = p->aAltM
19bd0 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20  ap[1+*piCol])>0 
19be0 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
19bf0 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20  ->pAltCursor;.  
19c00 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61      *piCol = iMa
19c10 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  p - 1;.      ret
19c20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19c30 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
19c40 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
19c50 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69  veto(p);.  }.  i
19c60 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  f( sqlite3BtreeC
19c70 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
19c80 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a  >uc.pCursor) ){.
19c90 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
19ca0 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
19cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19cc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19cd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19ce0 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
19cf0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19d00 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
19d10 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
19d20 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
19d30 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
19d40 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
19d50 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71  erialPut().** sq
19d60 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
19d70 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  et().**.** encap
19d80 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
19d90 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
19da0 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
19db0 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
19dc0 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
19dd0 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
19de0 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
19df0 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
19e00 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
19e10 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
19e20 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
19e30 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
19e40 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
19e50 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
19e60 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
19e70 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
19e80 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
19e90 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
19ea0 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
19eb0 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
19ec0 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
19ed0 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
19ee0 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
19ef0 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
19f00 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
19f10 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
19f20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
19f30 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
19f40 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
19f50 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
19f60 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
19f70 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
19f80 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
19f90 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
19fa0 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  ob separately..*
19fb0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
19fc0 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
19fd0 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
19fe0 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
19ff0 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
1a000 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
1a010 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
1a020 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
1a030 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
1a040 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1a050 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
1a060 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
1a090 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1a0c0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
1a0d0 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
1a100 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
1a110 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
1a120 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
1a130 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
1a140 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
1a170 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
1a180 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
1a1a0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
1a1b0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
1a1c0 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
1a1d0 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
1a1e0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
1a1f0 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
1a220 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
1a230 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
1a240 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
1a250 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
1a260 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a280 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
1a290 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
1a2a0 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
1a2b0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
1a2e0 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
1a2f0 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
1a300 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
1a310 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
1a320 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
1a330 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
1a340 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
1a350 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
1a360 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
1a370 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
1a380 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
1a390 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
1a3a0 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
1a3b0 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
1a3c0 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 23 69 66 20   types..*/..#if 
1a3d0 30 20 2f 2a 20 49 6e 6c 69 6e 65 64 20 69 6e 74  0 /* Inlined int
1a3e0 6f 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  o the OP_MakeRec
1a3f0 6f 72 64 20 6f 70 63 6f 64 65 20 2a 2f 0a 2f 2a  ord opcode */./*
1a400 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1a410 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
1a420 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
1a430 69 6e 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  in pMem..**.** T
1a440 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
1a450 74 20 63 6f 6e 76 65 72 74 20 61 20 6c 61 72 67  t convert a larg
1a460 65 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 76 61  e MEM_IntReal va
1a470 6c 75 65 20 69 6e 74 6f 20 4d 45 4d 5f 52 65 61  lue into MEM_Rea
1a480 6c 2e 0a 2a 2a 0a 2a 2a 20 32 30 31 39 2d 30 37  l..**.** 2019-07
1a490 2d 31 31 3a 20 20 54 68 65 20 70 72 69 6d 61 72  -11:  The primar
1a4a0 79 20 75 73 65 72 20 6f 66 20 74 68 69 73 20 73  y user of this s
1a4b0 75 62 72 6f 75 74 69 6e 65 20 77 61 73 20 74 68  ubroutine was th
1a4c0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 0a  e OP_MakeRecord.
1a4d0 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 20 74 68 65  ** opcode in the
1a4e0 20 62 79 74 65 2d 63 6f 64 65 20 65 6e 67 69 6e   byte-code engin
1a4f0 65 2e 20 20 42 75 74 20 62 79 20 6d 6f 76 69 6e  e.  But by movin
1a500 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  g this routine i
1a510 6e 2d 6c 69 6e 65 2c 20 77 65 0a 2a 2a 20 63 61  n-line, we.** ca
1a520 6e 20 6f 6d 69 74 20 73 6f 6d 65 20 72 65 64 75  n omit some redu
1a530 6e 64 61 6e 74 20 74 65 73 74 73 20 61 6e 64 20  ndant tests and 
1a540 6d 61 6b 65 20 74 68 61 74 20 6f 70 63 6f 64 65  make that opcode
1a550 20 61 20 6c 6f 74 20 66 61 73 74 65 72 2e 20 20   a lot faster.  
1a560 53 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  So.** this routi
1a570 6e 65 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 20 75  ne is now only u
1a580 73 65 64 20 62 79 20 74 68 65 20 53 54 41 54 33  sed by the STAT3
1a590 20 6c 6f 67 69 63 20 61 6e 64 20 53 54 41 54 33   logic and STAT3
1a5a0 20 73 75 70 70 6f 72 74 20 68 61 73 0a 2a 2a 20   support has.** 
1a5b0 65 6e 64 65 64 2e 20 20 54 68 65 20 63 6f 64 65  ended.  The code
1a5c0 20 69 73 20 6b 65 70 74 20 68 65 72 65 20 66 6f   is kept here fo
1a5d0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 66  r historical ref
1a5e0 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 0a 2a 2f 0a  erence only..*/.
1a5f0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1a600 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
1a610 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
1a620 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29  rmat, u32 *pLen)
1a630 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
1a640 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75  pMem->flags;.  u
1a650 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  32 n;..  assert(
1a660 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66   pLen!=0 );.  if
1a670 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
1a680 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
1a690 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  0;.    return 0;
1a6a0 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
1a6b0 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e  &(MEM_Int|MEM_In
1a6c0 74 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  tReal) ){.    /*
1a6d0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
1a6e0 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
1a6f0 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
1a700 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
1a710 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
1a720 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
1a730 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
1a740 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1a750 20 75 36 34 20 75 3b 0a 20 20 20 20 74 65 73 74   u64 u;.    test
1a760 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
1a770 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74 65 73  M_Int );.    tes
1a780 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1a790 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20  EM_IntReal );.  
1a7a0 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
1a7b0 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d     u = ~i;.    }
1a7c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
1a7d0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
1a7e0 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
1a7f0 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26   if( (i&1)==i &&
1a800 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
1a810 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e  ){.        *pLen
1a820 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
1a830 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20  turn 8+(u32)u;. 
1a840 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a850 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20      *pLen = 1;. 
1a860 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1a870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a880 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
1a890 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65  ){ *pLen = 2; re
1a8a0 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66  turn 2; }.    if
1a8b0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20  ( u<=8388607 ){ 
1a8c0 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72  *pLen = 3; retur
1a8d0 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 3; }.    if( u
1a8e0 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20  <=2147483647 ){ 
1a8f0 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72  *pLen = 4; retur
1a900 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 4; }.    if( u
1a910 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a  <=MAX_6BYTE ){ *
1a920 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e  pLen = 6; return
1a930 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20   5; }.    *pLen 
1a940 3d 20 38 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  = 8;.    if( fla
1a950 67 73 26 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29  gs&MEM_IntReal )
1a960 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1a970 65 20 76 61 6c 75 65 20 69 73 20 49 6e 74 52 65  e value is IntRe
1a980 61 6c 20 61 6e 64 20 69 73 20 67 6f 69 6e 67 20  al and is going 
1a990 74 6f 20 74 61 6b 65 20 75 70 20 38 20 62 79 74  to take up 8 byt
1a9a0 65 73 20 74 6f 20 73 74 6f 72 65 0a 20 20 20 20  es to store.    
1a9b0 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65 67    ** as an integ
1a9c0 65 72 2c 20 74 68 65 6e 20 77 65 20 6d 69 67 68  er, then we migh
1a9d0 74 20 61 73 20 77 65 6c 6c 20 6d 61 6b 65 20 69  t as well make i
1a9e0 74 20 61 6e 20 38 2d 62 79 74 65 20 66 6c 6f 61  t an 8-byte floa
1a9f0 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 6f  ting.      ** po
1aa00 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  int value */.   
1aa10 20 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20 28     pMem->u.r = (
1aa20 64 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e 75 2e 69  double)pMem->u.i
1aa30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1aa40 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 49 6e 74 52  ags &= ~MEM_IntR
1aa50 65 61 6c 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  eal;.      pMem-
1aa60 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65  >flags |= MEM_Re
1aa70 61 6c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  al;.      return
1aa80 20 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   7;.    }.    re
1aa90 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
1aaa0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
1aab0 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
1aac0 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  8;.    return 7;
1aad0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1aae0 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
1aaf0 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
1ab00 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
1ab10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1ab20 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e  Mem->n>=0 );.  n
1ab30 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b   = (u32)pMem->n;
1ab40 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
1ab50 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
1ab60 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
1ab70 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d  o;.  }.  *pLen =
1ab80 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   n;.  return ((n
1ab90 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
1aba0 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
1abb0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 6e  ;.}.#endif /* in
1abc0 6c 69 6e 65 64 20 69 6e 74 6f 20 4f 50 5f 4d 61  lined into OP_Ma
1abd0 6b 65 52 65 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a  keRecord */../*.
1abe0 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
1abf0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
1ac00 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73  ss than 128.*/.s
1ac10 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73  tatic const u8 s
1ac20 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
1ac30 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  izes[] = {.     
1ac40 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32     /*  0   1   2
1ac50 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36     3   4   5   6
1ac60 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20     7   8   9 */ 
1ac70 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30    ./*   0 */   0
1ac80 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
1ac90 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30  ,  6,  8,  8,  0
1aca0 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20  ,  0,./*  10 */ 
1acb0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
1acc0 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c    1,  1,  2,  2,
1acd0 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20    3,  3,./*  20 
1ace0 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20  */   4,  4,  5, 
1acf0 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20   5,  6,  6,  7, 
1ad00 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20   7,  8,  8,./*  
1ad10 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31  30 */   9,  9, 1
1ad20 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31  0, 10, 11, 11, 1
1ad30 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f  2, 12, 13, 13,./
1ad40 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34  *  40 */  14, 14
1ad50 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36  , 15, 15, 16, 16
1ad60 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38  , 17, 17, 18, 18
1ad70 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c  ,./*  50 */  19,
1ad80 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c   19, 20, 20, 21,
1ad90 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c   21, 22, 22, 23,
1ada0 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20   23,./*  60 */  
1adb0 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20  24, 24, 25, 25, 
1adc0 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20  26, 26, 27, 27, 
1add0 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a  28, 28,./*  70 *
1ade0 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33  /  29, 29, 30, 3
1adf0 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33  0, 31, 31, 32, 3
1ae00 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38  2, 33, 33,./*  8
1ae10 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35  0 */  34, 34, 35
1ae20 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37  , 35, 36, 36, 37
1ae30 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a  , 37, 38, 38,./*
1ae40 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c    90 */  39, 39,
1ae50 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c   40, 40, 41, 41,
1ae60 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c   42, 42, 43, 43,
1ae70 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20  ./* 100 */  44, 
1ae80 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20  44, 45, 45, 46, 
1ae90 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20  46, 47, 47, 48, 
1aea0 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34  48,./* 110 */  4
1aeb0 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35  9, 49, 50, 50, 5
1aec0 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35  1, 51, 52, 52, 5
1aed0 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f  3, 53,./* 120 */
1aee0 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35    54, 54, 55, 55
1aef0 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37  , 56, 56, 57, 57
1af00 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .};../*.** Retur
1af10 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
1af20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
1af30 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
1af40 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
1af50 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
1af60 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1af70 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
1af80 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
1af90 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a  al_type>=128 ){.
1afa0 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
1afb0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
1afc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1afd0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
1afe0 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  12 .            
1aff0 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  || sqlite3SmallT
1b000 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
1b010 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74  type]==(serial_t
1b020 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20  ype - 12)/2 );. 
1b030 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1b040 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
1b050 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
1b060 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64  }.}.u8 sqlite3Vd
1b070 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
1b080 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c  ypeLen(u8 serial
1b090 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
1b0a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1b0b0 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  8 );.  return sq
1b0c0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
1b0d0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
1b0e0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ;  .}../*.** If 
1b0f0 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
1b100 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
1b110 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
1b120 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
1b130 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
1b140 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
1b150 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
1b160 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
1b170 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
1b180 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
1b190 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
1b1a0 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
1b1b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
1b1c0 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
1b1d0 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
1b1e0 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
1b1f0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
1b200 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
1b210 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
1b220 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
1b230 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
1b240 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
1b250 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
1b260 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
1b270 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
1b280 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
1b290 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
1b2a0 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
1b2b0 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
1b2c0 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
1b2d0 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
1b2e0 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
1b2f0 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
1b300 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
1b310 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
1b320 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
1b330 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
1b340 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
1b350 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
1b360 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
1b370 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
1b380 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
1b390 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
1b3a0 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
1b3b0 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
1b3c0 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
1b3d0 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
1b3e0 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
1b3f0 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
1b400 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
1b410 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
1b420 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
1b430 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
1b440 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
1b450 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
1b460 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
1b470 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
1b480 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
1b490 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
1b4a0 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
1b4b0 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
1b4c0 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
1b4d0 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
1b4e0 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
1b4f0 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
1b500 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
1b510 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
1b520 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
1b530 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
1b540 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
1b550 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
1b560 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
1b570 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
1b580 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
1b590 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
1b5a0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1b5b0 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
1b5c0 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
1b5d0 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
1b5e0 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
1b5f0 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
1b600 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
1b610 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
1b620 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
1b630 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
1b640 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
1b650 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
1b660 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
1b670 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
1b680 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
1b690 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
1b6a0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
1b6b0 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
1b6c0 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
1b6d0 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
1b6e0 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
1b6f0 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
1b700 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
1b710 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
1b720 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
1b730 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
1b740 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
1b750 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
1b760 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
1b770 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b780 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1b790 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
1b7a0 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
1b7b0 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
1b7c0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
1b7d0 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
1b7e0 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
1b7f0 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
1b800 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
1b810 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
1b820 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
1b830 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
1b840 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1b850 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
1b860 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
1b870 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
1b880 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
1b890 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
1b8a0 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
1b8b0 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
1b8c0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
1b8d0 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
1b8e0 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
1b8f0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1b900 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
1b910 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
1b920 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
1b930 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b940 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
1b950 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
1b960 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
1b970 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
1b980 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
1b990 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
1b9a0 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
1b9b0 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
1b9c0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
1b9d0 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
1b9e0 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
1b9f0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
1ba00 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
1ba10 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
1ba20 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1ba30 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
1ba40 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
1ba50 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
1ba60 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
1ba70 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
1ba80 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
1ba90 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
1baa0 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
1bab0 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
1bac0 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
1bad0 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
1bae0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
1baf0 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
1bb00 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
1bb10 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
1bb20 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
1bb30 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
1bb40 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
1bb50 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
1bb60 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
1bb70 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
1bb80 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1bb90 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
1bba0 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
1bbb0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
1bbc0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
1bbd0 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
1bbe0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
1bbf0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
1bc00 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
1bc10 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
1bc20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
1bc30 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
1bc40 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
1bc50 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
1bc60 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ];.    assert( i
1bc70 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
1bc80 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
1bc90 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
1bca0 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
1bcb0 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
1bcc0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
1bcd0 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
1bce0 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
1bcf0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
1bd00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
1bd10 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
1bd20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1bd30 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
1bd40 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
1bd50 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
1bd60 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1bd70 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
1bd80 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
1bd90 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  >n;.    if( len>
1bda0 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  0 ) memcpy(buf, 
1bdb0 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
1bdc0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1bdd0 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
1bde0 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
1bdf0 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
1be00 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
1be10 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
1be20 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
1be30 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
1be40 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
1be50 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
1be60 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
1be70 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
1be80 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
1be90 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
1bea0 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
1beb0 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
1bec0 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
1bed0 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
1bee0 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
1bef0 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
1bf00 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
1bf10 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
1bf20 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
1bf30 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
1bf40 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
1bf50 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
1bf60 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
1bf70 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
1bf80 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
1bf90 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
1bfa0 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
1bfb0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
1bfc0 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
1bfd0 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
1bfe0 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
1bff0 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
1c000 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
1c010 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
1c020 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
1c030 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
1c040 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1c050 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
1c060 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1c070 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
1c080 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
1c090 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
1c0a0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
1c0b0 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
1c0c0 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
1c0d0 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
1c0e0 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
1c0f0 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
1c100 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
1c110 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
1c120 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
1c130 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
1c140 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
1c150 74 61 74 69 63 20 75 33 32 20 73 65 72 69 61 6c  tatic u32 serial
1c160 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
1c170 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
1c180 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
1c190 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
1c1a0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
1c1b0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
1c1c0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1c1d0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
1c1e0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
1c1f0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
1c200 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
1c210 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
1c220 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
1c230 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
1c240 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
1c250 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
1c260 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
1c270 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
1c280 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
1c290 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
1c2a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c2b0 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
1c2c0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1c2d0 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
1c2e0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1c2f0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1c300 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
1c310 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
1c320 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c330 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
1c340 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1c350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1c360 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
1c370 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
1c380 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1c390 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
1c3a0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
1c3b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
1c3c0 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
1c3d0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
1c3e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1c3f0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c400 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
1c410 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
1c420 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
1c430 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
1c440 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
1c450 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
1c460 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
1c470 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
1c480 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
1c490 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
1c4a0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
1c4b0 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
1c4c0 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
1c4d0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
1c4e0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
1c4f0 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
1c500 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
1c510 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
1c520 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
1c530 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
1c540 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
1c550 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
1c560 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
1c570 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
1c580 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
1c590 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
1c5a0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
1c5b0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
1c5c0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
1c5d0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1c5e0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
1c5f0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1c600 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
1c610 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
1c620 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
1c630 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 49 73  pMem->flags = Is
1c640 4e 61 4e 28 78 29 20 3f 20 4d 45 4d 5f 4e 75 6c  NaN(x) ? MEM_Nul
1c650 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
1c660 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a  }.  return 8;.}.
1c670 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1c680 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
1c690 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c6a0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
1c6b0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
1c6c0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
1c6d0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
1c6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1c6f0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
1c700 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
1c710 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
1c720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1c730 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
1c740 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
1c750 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
1c760 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1c770 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a 20    case 10: { /* 
1c780 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c  Internal use onl
1c790 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69 72  y: NULL with vir
1c7a0 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
1c7b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50 44            ** UPD
1c7c0 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66 6c  ATE no-change fl
1c7d0 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  ag set */.      
1c7e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1c7f0 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b  M_Null|MEM_Zero;
1c800 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
1c810 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   0;.      pMem->
1c820 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20  u.nZero = 0;.   
1c830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c840 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
1c850 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
1c860 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
1c870 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
1c880 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ull */.      /* 
1c890 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1c8a0 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65  4078-09375 Value
1c8b0 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20   is a NULL. */. 
1c8c0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1c8d0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
1c8e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c8f0 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
1c900 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c910 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39  OF: R-44885-2519
1c920 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d  6 Value is an 8-
1c930 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d  bit twos-complem
1c940 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  ent.      ** int
1c950 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1c960 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42  Mem->u.i = ONE_B
1c970 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1c980 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1c990 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1c9a0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1c9b0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1c9c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1c9d0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1c9e0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1c9f0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1ca00 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1ca10 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61  R-49794-35026 Va
1ca20 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1ca30 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20  ian 16-bit.     
1ca40 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1ca50 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1ca60 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1ca70 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  = TWO_BYTE_INT(b
1ca80 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1ca90 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1caa0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1cab0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1cac0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
1cad0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1cae0 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
1caf0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1cb00 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1cb10 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35  CE-OF: R-37839-5
1cb20 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20  4301 Value is a 
1cb30 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69  big-endian 24-bi
1cb40 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1cb50 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1cb60 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1cb70 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42  m->u.i = THREE_B
1cb80 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1cb90 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1cba0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1cbb0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1cbc0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1cbd0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
1cbe0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1cbf0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1cc00 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1cc10 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1cc20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61  R-01849-26079 Va
1cc30 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1cc40 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20  ian 32-bit.     
1cc50 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1cc60 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1cc70 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1cc80 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
1cc90 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48  buf);.#ifdef __H
1cca0 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57  P_cc .      /* W
1ccb0 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67  ork around a sig
1ccc0 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20  n-extension bug 
1ccd0 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c  in the HP compil
1cce0 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a  er for HP/UX */.
1ccf0 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d        if( buf[0]
1cd00 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e  &0x80 ) pMem->u.
1cd10 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38  i |= 0xffffffff8
1cd20 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69  0000000LL;.#endi
1cd30 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  f.      pMem->fl
1cd40 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1cd50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1cd60 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1cd70 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
1cd80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1cd90 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1cda0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1cdb0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1cdc0 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37  OF: R-50385-0967
1cdd0 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1cde0 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20  -endian 48-bit. 
1cdf0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1ce00 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1ce10 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1ce20 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1ce30 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28  UINT(buf+2) + ((
1ce40 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1ce50 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1ce60 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1ce70 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1ce80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1ce90 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1cea0 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
1ceb0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
1cec0 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1ced0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1cee0 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
1cef0 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
1cf00 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   */.      /* The
1cf10 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72  se use local var
1cf20 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68  iables, so do th
1cf30 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  em in a separate
1cf40 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a   routine.      *
1cf50 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e  * to avoid havin
1cf60 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72  g to move the fr
1cf70 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ame pointer in t
1cf80 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
1cf90 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  /.      return s
1cfa0 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72  erialGet(buf,ser
1cfb0 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a  ial_type,pMem);.
1cfc0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
1cfd0 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
1cfe0 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
1cff0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
1d000 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1d010 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37  DENCE-OF: R-1297
1d020 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73  6-22893 Value is
1d030 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20   the integer 0. 
1d040 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1d050 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33  ENCE-OF: R-18143
1d060 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20  -12121 Value is 
1d070 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a  the integer 1. *
1d080 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1d090 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
1d0a0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
1d0b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1d0c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1d0d0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
1d0e0 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t: {.      /* EV
1d0f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36  IDENCE-OF: R-146
1d100 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69  06-31564 Value i
1d110 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73  s a BLOB that is
1d120 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20   (N-12)/2 bytes 
1d130 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67  in.      ** leng
1d140 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49  th..      ** EVI
1d150 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30  DENCE-OF: R-2840
1d160 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73  1-00140 Value is
1d170 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65   a string in the
1d180 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
1d190 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31  nd.      ** (N-1
1d1a0 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65  3)/2 bytes in le
1d1b0 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ngth. */.      s
1d1c0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
1d1d0 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
1d1e0 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20  Blob|MEM_Ephem, 
1d1f0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65  MEM_Str|MEM_Ephe
1d200 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  m };.      pMem-
1d210 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
1d220 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1d230 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
1d240 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
1d250 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
1d260 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a  serial_type&1];.
1d270 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65        return pMe
1d280 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  m->n;.    }.  }.
1d290 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a    return 0;.}./*
1d2a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d2b0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
1d2c0 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20  cate sufficient 
1d2d0 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70  space for an Unp
1d2e0 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
1d2f0 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65  tructure large e
1d300 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64  nough to be used
1d310 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62   with sqlite3Vdb
1d320 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
1d330 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  if.** the first 
1d340 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1d350 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f  inter to KeyInfo
1d360 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49   structure pKeyI
1d370 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nfo..**.** The s
1d380 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61  pace is either a
1d390 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
1d3a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1d3b0 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  w() or from with
1d3c0 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67  in.** the unalig
1d3d0 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65  ned buffer passe
1d3e0 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
1d3f0 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
1d400 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79  ents (presumably
1d410 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29  .** stack space)
1d420 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c  . If the former,
1d430 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73   then *ppFree is
1d440 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65   set to a pointe
1d450 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  r that should.**
1d460 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
1d470 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1d480 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1d490 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66  DbFree(). Or, if
1d4a0 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
1d4b0 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
1d4c0 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63  he pSpace/szSpac
1d4d0 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65  e buffer, *ppFre
1d4e0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1d4f0 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
1d500 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1d510 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
1d520 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
1d530 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65  rned..*/.Unpacke
1d540 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
1d550 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1d560 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e  dRecord(.  KeyIn
1d570 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1d580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1d590 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1d5a0 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
1d5b0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1d5c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1d5d0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
1d5e0 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
1d5f0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1d620 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
1d630 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20  r *p */.  nByte 
1d640 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
1d650 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1d660 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
1d670 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1d680 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55  eld+1);.  p = (U
1d690 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29  npackedRecord *)
1d6a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1d6b0 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
1d6c0 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21   nByte);.  if( !
1d6d0 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
1d6e0 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
1d6f0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
1d700 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1d710 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
1d720 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1d730 3e 61 53 6f 72 74 46 6c 61 67 73 21 3d 30 20 29  >aSortFlags!=0 )
1d740 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
1d750 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
1d760 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
1d770 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20  fo->nKeyField + 
1d780 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
1d790 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1d7a0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
1d7b0 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
1d7c0 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
1d7d0 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
1d7e0 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
1d7f0 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1d800 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
1d810 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
1d820 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1d830 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
1d840 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
1d850 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1d860 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
1d870 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
1d880 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1d890 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
1d8a0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
1d8b0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1d8c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1d8d0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1d8e0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1d8f0 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1d900 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1d910 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1d920 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
1d930 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
1d940 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
1d950 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
1d960 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1d970 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1d980 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1d990 20 2a 29 70 4b 65 79 3b 0a 20 20 75 33 32 20 64   *)pKey;.  u32 d
1d9a0 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1d9d0 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
1d9e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
1d9f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1da10 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1da20 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
1da30 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
1da40 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
1da50 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
1da60 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1da70 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1da80 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
1da90 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1daa0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
1dab0 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
1dac0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1dad0 48 64 72 20 26 26 20 64 3c 3d 28 75 33 32 29 6e  Hdr && d<=(u32)n
1dae0 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73  Key ){.    u32 s
1daf0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
1db00 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1db10 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20  t32(&aKey[idx], 
1db20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1db30 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
1db40 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1db50 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
1db60 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a  Info->db;.    /*
1db70 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
1db80 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65  ; // sqlite3Vdbe
1db90 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c  SerialGet() will
1dba0 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73   set this for us
1dbb0 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a   */.    pMem->sz
1dbc0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
1dbd0 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20  pMem->z = 0;.   
1dbe0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
1dbf0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1dc00 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
1dc10 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
1dc20 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b  m++;.    if( (++
1dc30 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20  u)>=p->nField ) 
1dc40 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1dc50 20 64 3e 28 75 33 32 29 6e 4b 65 79 20 26 26 20   d>(u32)nKey && 
1dc60 75 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  u ){.    assert(
1dc70 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1dc80 20 20 20 2f 2a 20 49 6e 20 61 20 63 6f 72 72 75     /* In a corru
1dc90 70 74 20 72 65 63 6f 72 64 20 65 6e 74 72 79 2c  pt record entry,
1dca0 20 74 68 65 20 6c 61 73 74 20 70 4d 65 6d 20 6d   the last pMem m
1dcb0 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 73  ight have been s
1dcc0 65 74 20 75 70 20 75 73 69 6e 67 20 0a 20 20 20  et up using .   
1dcd0 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
1dce0 64 20 6d 65 6d 6f 72 79 2e 20 4f 76 65 72 77 72  d memory. Overwr
1dcf0 69 74 65 20 69 74 73 20 76 61 6c 75 65 20 77 69  ite its value wi
1dd00 74 68 20 4e 55 4c 4c 2c 20 74 6f 20 70 72 65 76  th NULL, to prev
1dd10 65 6e 74 0a 20 20 20 20 2a 2a 20 77 61 72 6e 69  ent.    ** warni
1dd20 6e 67 73 20 66 72 6f 6d 20 4d 53 41 4e 2e 20 2a  ngs from MSAN. *
1dd30 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1dd40 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d  eMemSetNull(pMem
1dd50 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  -1);.  }.  asser
1dd60 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
1dd70 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b  nKeyField + 1 );
1dd80 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
1dd90 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1dda0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
1ddb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1ddc0 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
1ddd0 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
1dde0 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
1ddf0 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
1de00 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1de10 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
1de20 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
1de30 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
1de40 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1de50 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
1de60 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
1de70 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
1de80 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1de90 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
1dea0 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
1deb0 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
1dec0 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
1ded0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
1dee0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1def0 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
1df00 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
1df10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1df20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
1df30 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
1df40 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
1df50 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1df60 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
1df70 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
1df80 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
1df90 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
1dfa0 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
1dfb0 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
1dfc0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1dfd0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1dfe0 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
1dff0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1e000 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1e010 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
1e020 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
1e030 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
1e040 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1e050 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
1e060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1e070 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
1e080 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1e090 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1e0a0 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1e0b0 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1e0c0 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
1e0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1e0e0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1e0f0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
1e100 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
1e110 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
1e120 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1e130 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
1e140 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
1e150 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
1e160 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1e170 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1e180 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1e190 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
1e1a0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
1e1b0 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
1e1c0 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1e1d0 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
1e1e0 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
1e1f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
1e200 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1e210 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
1e220 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1e230 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
1e240 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
1e250 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1e260 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e270 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
1e280 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1e290 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1e2a0 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1e2b0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1e2c0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
1e2d0 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
1e2e0 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
1e2f0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
1e300 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1e310 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
1e320 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
1e330 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
1e340 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
1e350 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
1e360 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
1e370 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
1e380 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
1e390 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
1e3a0 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
1e3b0 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
1e3c0 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
1e3d0 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
1e3e0 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
1e3f0 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
1e400 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
1e410 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
1e420 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
1e430 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
1e440 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
1e450 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
1e460 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
1e470 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
1e480 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
1e490 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
1e4a0 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
1e4b0 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
1e4c0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1e4d0 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
1e4e0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1e4f0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66  1, szHdr1);.  if
1e500 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29  ( szHdr1>98307 )
1e510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e520 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73  ORRUPT;.  d1 = s
1e530 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
1e540 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1e550 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1e560 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ield || CORRUPT_
1e570 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1e580 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46  pKeyInfo->aSortF
1e590 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  lags!=0 );.  ass
1e5a0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1e5b0 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  KeyField>0 );.  
1e5c0 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1e5d0 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1e5e0 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1e5f0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
1e600 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
1e610 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
1e620 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
1e630 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
1e640 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
1e650 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
1e660 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
1e670 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
1e680 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1e690 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
1e6a0 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
1e6b0 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
1e6c0 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
1e6d0 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
1e6e0 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
1e6f0 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
1e700 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
1e710 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
1e720 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
1e730 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
1e740 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
1e750 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
1e760 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
1e770 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
1e780 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
1e790 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
1e7a0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
1e7b0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1e7c0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1e7d0 69 66 28 20 64 31 2b 28 75 36 34 29 73 65 72 69  if( d1+(u64)seri
1e7e0 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 36 34 29  al_type1+2>(u64)
1e7f0 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31  nKey1.     && d1
1e800 2b 28 75 36 34 29 73 71 6c 69 74 65 33 56 64 62  +(u64)sqlite3Vdb
1e810 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1e820 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 36  erial_type1)>(u6
1e830 34 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a  4)nKey1 .    ){.
1e840 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e850 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
1e860 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
1e870 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
1e880 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
1e890 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1e8a0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1e8b0 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
1e8c0 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
1e8d0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
1e8e0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1e8f0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1e900 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
1e910 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
1e940 6e 41 6c 6c 46 69 65 6c 64 3e 69 20 3f 20 70 4b  nAllField>i ? pK
1e950 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1e960 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
1e970 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
1e980 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1e990 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
1e9a0 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
1e9b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 4b  */.      if( (pK
1e9c0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61  eyInfo->aSortFla
1e9d0 67 73 5b 69 5d 20 26 20 4b 45 59 49 4e 46 4f 5f  gs[i] & KEYINFO_
1e9e0 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 29 0a 20  ORDER_BIGNULL). 
1e9f0 20 20 20 20 20 20 26 26 20 28 28 6d 65 6d 31 2e        && ((mem1.
1ea00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
1ea10 29 20 7c 7c 20 28 70 50 4b 65 79 32 2d 3e 61 4d  ) || (pPKey2->aM
1ea20 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45  em[i].flags & ME
1ea30 4d 5f 4e 75 6c 6c 29 29 20 0a 20 20 20 20 20 20  M_Null)) .      
1ea40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ea50 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
1ea60 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1ea70 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 20 26  >aSortFlags[i] &
1ea80 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44   KEYINFO_ORDER_D
1ea90 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ESC ){.        r
1eaa0 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76  c = -rc;  /* Inv
1eab0 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  ert the result f
1eac0 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  or DESC sort ord
1ead0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  er. */.      }. 
1eae0 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43       goto debugC
1eaf0 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d  ompareEnd;.    }
1eb00 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
1eb10 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
1eb20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1eb30 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
1eb40 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1eb50 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1eb60 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1eb70 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1eb80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1eb90 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1eba0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1ebb0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1ebc0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1ebd0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1ebe0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1ebf0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
1ec00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1ec10 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1ec20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1ec30 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1ec40 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
1ec50 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1ec60 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1ec70 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1ec80 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1ec90 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1eca0 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1ecb0 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63   value.  */.  rc
1ecc0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1ecd0 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d  lt_rc;..debugCom
1ece0 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64  pareEnd:.  if( d
1ecf0 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20  esiredResult==0 
1ed00 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72  && rc==0 ) retur
1ed10 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1ed20 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63  edResult<0 && rc
1ed30 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
1ed40 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1ed50 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72  lt>0 && rc>0 ) r
1ed60 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43  eturn 1;.  if( C
1ed70 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1ed80 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79  rn 1;.  if( pKey
1ed90 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1eda0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1edb0 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
1edc0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1edd0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1ede0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1edf0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61  ber of fields (a
1ee00 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69  .k.a. columns) i
1ee10 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76  n the record giv
1ee20 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b  en by.** pKey,nK
1ee30 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20  ey.  The verify 
1ee40 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20  that this count 
1ee50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1ee60 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20  equal to the.** 
1ee70 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70  limit given by p
1ee80 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1ee90 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1eea0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1eeb0 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1eec0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1eed0 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1eee0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1eef0 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1ef00 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1ef10 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1ef20 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1ef30 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1ef40 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1ef50 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1ef60 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1ef70 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65   the KeyInfo.nKe
1ef80 79 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66  yField or KeyInf
1ef90 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75  o.nAllField valu
1efa0 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1efb0 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1efc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1efd0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1efe0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1eff0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1f000 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1f010 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1f020 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1f030 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1f040 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1f050 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1f060 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1f070 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1f080 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1f090 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1f0a0 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1f0b0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f0c0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1f0d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1f0e0 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1f0f0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1f100 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1f110 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1f120 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1f130 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1f140 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1f150 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1f160 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1f170 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1f180 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1f190 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1f1a0 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1f1b0 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1f1c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1f1d0 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  ield );.}.#else.
1f1e0 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73  # define vdbeAss
1f1f0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1f200 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29  hinLimits(A,B,C)
1f210 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42  .#endif../*.** B
1f220 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a  oth *pMem1 and *
1f230 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74  pMem2 contain st
1f240 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ring values. Com
1f250 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c  pare the two val
1f260 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ues.** using the
1f270 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1f280 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73  nce pColl. As us
1f290 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65  ual, return a ne
1f2a0 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a  gative , zero.**
1f2b0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c   or positive val
1f2c0 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20  ue if *pMem1 is 
1f2d0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1f2e0 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74   to or greater t
1f2f0 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20  han .** *pMem2, 
1f300 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69  respectively. Si
1f310 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20  milar in spirit 
1f320 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31  to "rc = (*pMem1
1f330 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a  ) - (*pMem2);"..
1f340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1f350 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1f360 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  ng(.  const Mem 
1f370 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20  *pMem1,.  const 
1f380 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f  Mem *pMem2,.  co
1f390 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1f3a0 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72  ll,.  u8 *prcErr
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f        /* If an O
1f3d0 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  OM occurs, set t
1f3e0 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a  o SQLITE_NOMEM *
1f3f0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31  /.){.  if( pMem1
1f400 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
1f410 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  c ){.    /* The 
1f420 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65  strings are alre
1f430 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ady in the corre
1f440 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61  ct encoding.  Ca
1f450 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63  ll the.     ** c
1f460 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1f470 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20  on directly */. 
1f480 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d     return pColl-
1f490 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1f4a0 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d  er,pMem1->n,pMem
1f4b0 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d  1->z,pMem2->n,pM
1f4c0 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65  em2->z);.  }else
1f4d0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1f4e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31    const void *v1
1f4f0 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63  , *v2;.    Mem c
1f500 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20  1;.    Mem c2;. 
1f510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1f520 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31  mInit(&c1, pMem1
1f530 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1f540 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f550 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65  MemInit(&c2, pMe
1f560 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1f570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1f580 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1f590 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d  (&c1, pMem1, MEM
1f5a0 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c  _Ephem);.    sql
1f5b0 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
1f5c0 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d  owCopy(&c2, pMem
1f5d0 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  2, MEM_Ephem);. 
1f5e0 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56     v1 = sqlite3V
1f5f0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1f600 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43  3_value*)&c1, pC
1f610 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76  oll->enc);.    v
1f620 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  2 = sqlite3Value
1f630 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1f640 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d  lue*)&c2, pColl-
1f650 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28  >enc);.    if( (
1f660 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20  v1==0 || v2==0) 
1f670 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 63  ){.      if( prc
1f680 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20  Err ) *prcErr = 
1f690 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1f6a0 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  T;.      rc = 0;
1f6b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f6c0 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43    rc = pColl->xC
1f6d0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1f6e0 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c   c1.n, v1, c2.n,
1f6f0 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   v2);.    }.    
1f700 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1f710 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20  lease(&c1);.    
1f720 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1f730 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20  lease(&c2);.    
1f740 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d  return rc;.  }.}
1f750 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
1f760 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61  t pBlob is guara
1f770 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c  nteed to be a Bl
1f780 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d  ob that is not m
1f790 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45  arked.** with ME
1f7a0 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  M_Zero.  Return 
1f7b0 74 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64  true if it could
1f7c0 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e   be a zero-blob.
1f7d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1f7e0 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63  sAllZero(const c
1f7f0 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
1f800 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1f810 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1f820 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65     if( z[i] ) re
1f830 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
1f840 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1f850 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f   Compare two blo
1f860 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  bs.  Return nega
1f870 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1f880 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1f890 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20  irst.** is less 
1f8a0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1f8b0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1f8c0 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70  the second, resp
1f8d0 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20  ectively..** If 
1f8e0 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72  one blob is a pr
1f8f0 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65  efix of the othe
1f900 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72  r, then the shor
1f910 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f  ter is the lesso
1f920 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49  r..*/.SQLITE_NOI
1f930 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65  NLINE int sqlite
1f940 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e  3BlobCompare(con
1f950 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e  st Mem *pB1, con
1f960 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20  st Mem *pB2){.  
1f970 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20  int c;.  int n1 
1f980 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20  = pB1->n;.  int 
1f990 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20  n2 = pB2->n;..  
1f9a0 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  /* It is possibl
1f9b0 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62  e to have a Blob
1f9c0 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20   value that has 
1f9d0 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f  some non-zero co
1f9e0 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  ntent.  ** follo
1f9f0 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74  wed by zero cont
1fa00 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f  ent.  But that o
1fa10 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72  nly comes up for
1fa20 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20   Blobs formed.  
1fa30 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ** by the OP_Mak
1fa40 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20  eRecord opcode, 
1fa50 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e  and such Blobs n
1fa60 65 76 65 72 20 67 65 74 20 70 61 73 73 65 64 20  ever get passed 
1fa70 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
1fa80 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a  3MemCompare(). *
1fa90 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 31  /.  assert( (pB1
1faa0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1fab0 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20  ro)==0 || n1==0 
1fac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
1fad0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1fae0 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30  ero)==0 || n2==0
1faf0 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d   );..  if( (pB1-
1fb00 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67  >flags|pB2->flag
1fb10 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  s) & MEM_Zero ){
1fb20 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c  .    if( pB1->fl
1fb30 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73  ags & pB2->flags
1fb40 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1fb50 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d       return pB1-
1fb60 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e  >u.nZero - pB2->
1fb70 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c  u.nZero;.    }el
1fb80 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67  se if( pB1->flag
1fb90 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
1fba0 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c        if( !isAll
1fbb0 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32  Zero(pB2->z, pB2
1fbc0 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31  ->n) ) return -1
1fbd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1fbe0 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32  B1->u.nZero - n2
1fbf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fc00 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72     if( !isAllZer
1fc10 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e  o(pB1->z, pB1->n
1fc20 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  ) ) return +1;. 
1fc30 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d       return n1 -
1fc40 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20   pB2->u.nZero;. 
1fc50 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d     }.  }.  c = m
1fc60 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42  emcmp(pB1->z, pB
1fc70 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32  2->z, n1>n2 ? n2
1fc80 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20   : n1);.  if( c 
1fc90 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65  ) return c;.  re
1fca0 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a  turn n1 - n2;.}.
1fcb0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70  ./*.** Do a comp
1fcc0 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61  arison between a
1fcd0 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
1fce0 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d  nteger and a 64-
1fcf0 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69  bit floating-poi
1fd00 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52  nt.** number.  R
1fd10 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
1fd20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1fd30 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28  e if the first (
1fd40 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61  i64) is less tha
1fd50 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20  n,.** equal to, 
1fd60 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1fd70 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62  the second (doub
1fd80 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  le)..*/.static i
1fd90 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  nt sqlite3IntFlo
1fda0 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c  atCompare(i64 i,
1fdb0 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66   double r){.  if
1fdc0 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55  ( sizeof(LONGDOU
1fdd0 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20  BLE_TYPE)>8 ){. 
1fde0 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59     LONGDOUBLE_TY
1fdf0 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42  PE x = (LONGDOUB
1fe00 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69  LE_TYPE)i;.    i
1fe10 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20  f( x<r ) return 
1fe20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20  -1;.    if( x>r 
1fe30 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1fe40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
1fe50 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20  se{.    i64 y;. 
1fe60 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20     double s;.   
1fe70 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30   if( r<-92233720
1fe80 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20  36854775808.0 ) 
1fe90 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69  return +1;.    i
1fea0 66 28 20 72 3e 3d 39 32 32 33 33 37 32 30 33 36  f( r>=9223372036
1feb0 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65  854775808.0 ) re
1fec0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d  turn -1;.    y =
1fed0 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28   (i64)r;.    if(
1fee0 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31   i<y ) return -1
1fef0 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 20  ;.    if( i>y ) 
1ff00 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 73  return +1;.    s
1ff10 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20   = (double)i;.  
1ff20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75    if( s<r ) retu
1ff30 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73  rn -1;.    if( s
1ff40 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1ff50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1ff60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1ff70 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f  re the values co
1ff80 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74  ntained by the t
1ff90 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c  wo memory cells,
1ffa0 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65   returning.** ne
1ffb0 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20  gative, zero or 
1ffc0 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d  positive if pMem
1ffd0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1ffe0 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1fff0 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65  ater.** than pMe
20000 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65  m2. Sorting orde
20010 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73  r is NULL's firs
20020 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e  t, followed by n
20030 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73  umbers (integers
20040 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73  .** and reals) s
20050 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c  orted numericall
20060 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  y, followed by t
20070 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74  ext ordered by t
20080 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
20090 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61  sequence pColl a
200a0 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27  nd finally blob'
200b0 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d  s ordered by mem
200c0 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  cmp()..**.** Two
200d0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
200e0 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
200f0 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  l by this functi
20100 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
20110 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e  e3MemCompare(con
20120 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63  st Mem *pMem1, c
20130 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
20140 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
20150 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31  pColl){.  int f1
20160 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62  , f2;.  int comb
20170 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66  ined_flags;..  f
20180 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  1 = pMem1->flags
20190 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e  ;.  f2 = pMem2->
201a0 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65  flags;.  combine
201b0 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b  d_flags = f1|f2;
201c0 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
201d0 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
201e0 65 74 28 70 4d 65 6d 31 29 20 26 26 20 21 73 71  et(pMem1) && !sq
201f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f  lite3VdbeMemIsRo
20200 77 53 65 74 28 70 4d 65 6d 32 29 20 29 3b 0a 20  wSet(pMem2) );. 
20210 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
20220 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69  ue is NULL, it i
20230 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
20240 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76  other. If both v
20250 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e  alues.  ** are N
20260 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ULL, return 0.. 
20270 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
20280 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ed_flags&MEM_Nul
20290 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
202a0 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20  (f2&MEM_Null) - 
202b0 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  (f1&MEM_Null);. 
202c0 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73   }..  /* At leas
202d0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  t one of the two
202e0 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d   values is a num
202f0 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ber.  */.  if( c
20300 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
20310 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c  EM_Int|MEM_Real|
20320 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a  MEM_IntReal) ){.
20330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6f      testcase( co
20340 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d  mbined_flags & M
20350 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74 65  EM_Int );.    te
20360 73 74 63 61 73 65 28 20 63 6f 6d 62 69 6e 65 64  stcase( combined
20370 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  _flags & MEM_Rea
20380 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
20390 65 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  e( combined_flag
203a0 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20  s & MEM_IntReal 
203b0 29 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  );.    if( (f1 &
203c0 20 66 32 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d   f2 & (MEM_Int|M
203d0 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30 20  EM_IntReal))!=0 
203e0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
203f0 65 28 20 66 31 20 26 20 66 32 20 26 20 4d 45 4d  e( f1 & f2 & MEM
20400 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  _Int );.      te
20410 73 74 63 61 73 65 28 20 66 31 20 26 20 66 32 20  stcase( f1 & f2 
20420 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b  & MEM_IntReal );
20430 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
20440 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.i < pMem2->u
20450 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .i ) return -1;.
20460 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
20470 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i > pMem2->u.
20480 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  i ) return +1;. 
20490 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
204a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
204b0 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c   & f2 & MEM_Real
204c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
204d0 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70  ( pMem1->u.r < p
204e0 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
204f0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
20500 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d   pMem1->u.r > pM
20510 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
20520 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
20530 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
20540 69 66 28 20 28 66 31 26 28 4d 45 4d 5f 49 6e 74  if( (f1&(MEM_Int
20550 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d  |MEM_IntReal))!=
20560 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
20570 61 73 65 28 20 66 31 20 26 20 4d 45 4d 5f 49 6e  ase( f1 & MEM_In
20580 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
20590 61 73 65 28 20 66 31 20 26 20 4d 45 4d 5f 49 6e  ase( f1 & MEM_In
205a0 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69  tReal );.      i
205b0 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29  f( (f2&MEM_Real)
205c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
205d0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74  eturn sqlite3Int
205e0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
205f0 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e  m1->u.i, pMem2->
20600 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
20610 65 20 69 66 28 20 28 66 32 26 28 4d 45 4d 5f 49  e if( (f2&(MEM_I
20620 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29  nt|MEM_IntReal))
20630 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
20640 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
20650 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
20660 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
20670 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e  if( pMem1->u.i >
20680 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
20690 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 20  turn +1;.       
206a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
206b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
206c0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
206d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
206e0 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
206f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
20700 66 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  f2&(MEM_Int|MEM_
20710 49 6e 74 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a  IntReal))!=0 ){.
20720 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20730 28 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 20 29  ( f2 & MEM_Int )
20740 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20750 73 65 28 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74  se( f2 & MEM_Int
20760 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Real );.        
20770 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49  return -sqlite3I
20780 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
20790 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31  Mem2->u.i, pMem1
207a0 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
207b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
207c0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
207d0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
207e0 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   +1;.  }..  /* I
207f0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
20800 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
20810 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
20820 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
20830 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
20840 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
20850 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
20860 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
20870 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
20880 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
20890 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
208a0 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
208b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
208c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
208d0 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
208e0 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
208f0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
20900 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
20910 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
20920 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e  ->enc || pMem1->
20930 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20950 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
20960 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
20970 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
20980 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
20990 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
209a0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
209b0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
209c0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
209d0 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
209e0 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
209f0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
20a00 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
20a10 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
20a20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
20a30 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
20a40 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
20a50 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
20a60 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
20a70 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
20a80 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
20a90 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
20aa0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
20ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
20ac0 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
20ad0 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
20ae0 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   pColl, 0);.    
20af0 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
20b00 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
20b10 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
20b20 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
20b30 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
20b40 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
20b50 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
20b60 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
20b70 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
20b80 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
20b90 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
20ba0 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
20bb0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f  eturn sqlite3Blo
20bc0 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20  bCompare(pMem1, 
20bd0 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pMem2);.}.../*.*
20be0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
20bf0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
20c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20c10 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68  a serial-type th
20c20 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
20c30 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  s to an integer 
20c40 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74  - all values bet
20c50 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63  ween 1 and 9 inc
20c60 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70  lusive .** excep
20c70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  t 7. The second 
20c80 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
20c90 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
20ca0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
20cb0 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63  * serialized acc
20cc0 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c  ording to serial
20cd0 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63  _type. This func
20ce0 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
20cf0 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  s.** and returns
20d00 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
20d10 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65  tatic i64 vdbeRe
20d20 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33  cordDecodeInt(u3
20d30 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63  2 serial_type, c
20d40 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
20d50 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72    u32 y;.  asser
20d60 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
20d70 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31   (serial_type>=1
20d80 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   && serial_type<
20d90 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =9 && serial_typ
20da0 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63  e!=7) );.  switc
20db0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
20dc0 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20  {.    case 0:.  
20dd0 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
20de0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
20df0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
20e00 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f  return ONE_BYTE_
20e10 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
20e20 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73  ase 2:.      tes
20e30 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
20e40 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
20e50 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  urn TWO_BYTE_INT
20e60 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
20e70 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   3:.      testca
20e80 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
20e90 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20ea0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
20eb0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
20ec0 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  4: {.      testc
20ed0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
20ee0 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  0 );.      y = F
20ef0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20f00 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
20f10 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  n (i64)*(int*)&y
20f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20f30 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   5: {.      test
20f40 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
20f50 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
20f60 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  rn FOUR_BYTE_UIN
20f70 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
20f80 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
20f90 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20fa0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
20fb0 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d   {.      u64 x =
20fc0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
20fd0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20fe0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
20ff0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d  x80 );.      x =
21000 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
21010 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
21020 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21030 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a  (i64)*(i64*)&x;.
21040 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
21050 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
21060 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 8);.}../*.** 
21070 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
21080 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
21090 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
210a0 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
210b0 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
210c0 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
210d0 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
210e0 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
210f0 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
21100 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
21110 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
21120 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
21130 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
21140 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
21150 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
21160 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
21170 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
21180 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
21190 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
211a0 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
211b0 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
211c0 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
211d0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
211e0 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
211f0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
21200 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69  argument bSkip i
21210 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  s non-zero, it i
21220 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
21230 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
21240 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69  ready.** determi
21250 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
21260 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
21270 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
21280 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
21290 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
212a0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
212b0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
212c0 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a  ields. If all .*
212d0 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70  * fields that ap
212e0 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79  pear in both key
212f0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
21300 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
21310 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75  t_rc is .** retu
21320 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  rned..**.** If d
21330 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
21340 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64  on is discovered
21350 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72  , set pPKey2->er
21360 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c  rCode to .** SQL
21370 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
21380 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20  return 0. If an 
21390 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
213a0 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50  ountered, .** pP
213b0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73  Key2->errCode is
213c0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
213d0 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20  OMEM and, if it 
213e0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
213f0 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65  .** malloc-faile
21400 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61  d flag set on da
21410 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70  tabase handle (p
21420 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
21430 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  >db)..*/.int sql
21440 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21450 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20  mpareWithSkip(. 
21460 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
21470 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
21480 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
21490 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
214a0 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
214b0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
214c0 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214e0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
214f0 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
21500 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
21510 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21530 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
21540 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
21550 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
21560 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21580 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
21590 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
215a0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
215d0 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
215e0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
215f0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
21600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
21610 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
21620 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
21630 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
21660 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
21670 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
21680 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
21690 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
216a0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
216b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
216c0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
216d0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
216e0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
216f0 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
21700 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a   Mem mem1;..  /*
21710 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75   If bSkip is tru
21720 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
21730 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  er has already d
21740 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
21750 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
21760 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
21770 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
21780 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75  . Fix the variou
21790 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
217a0 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  s so.  ** that t
217b0 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69  his routine begi
217c0 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20  ns comparing at 
217d0 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64  the second field
217e0 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70  . */.  if( bSkip
217f0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a   ){.    u32 s1;.
21800 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67      idx1 = 1 + g
21810 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
21820 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73  1[1], s1);.    s
21830 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d  zHdr1 = aKey1[0]
21840 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
21850 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53  1 + sqlite3VdbeS
21860 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29  erialTypeLen(s1)
21870 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
21880 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65   pRhs++;.  }else
21890 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74  {.    idx1 = get
218a0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
218b0 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20  szHdr1);.    d1 
218c0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 20  = szHdr1;.    i 
218d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  = 0;.  }.  if( d
218e0 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
218f0 31 20 29 7b 20 0a 20 20 20 20 70 50 4b 65 79 32  1 ){ .    pPKey2
21900 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
21910 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21920 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
21930 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
21940 6e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  n */.  }..  VVA_
21950 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
21960 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
21970 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
21980 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
21990 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
219a0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
219b0 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79  nAllField>=pPKey
219c0 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
219d0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
219e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
219f0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
21a00 53 6f 72 74 46 6c 61 67 73 21 3d 30 20 29 3b 0a  SortFlags!=0 );.
21a10 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
21a20 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  ->pKeyInfo->nKey
21a30 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
21a40 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
21a50 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
21a60 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
21a70 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
21a80 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20     /* RHS is an 
21a90 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69  integer */.    i
21aa0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
21ab0 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e   (MEM_Int|MEM_In
21ac0 74 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  tReal) ){.      
21ad0 74 65 73 74 63 61 73 65 28 20 70 52 68 73 2d 3e  testcase( pRhs->
21ae0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
21af0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21b00 65 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  e( pRhs->flags &
21b10 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a   MEM_IntReal );.
21b20 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
21b30 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
21b40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21b50 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
21b60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
21b70 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
21b80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
21b90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21ba0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
21bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21bc0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
21bd0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21be0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==7 ){.        s
21bf0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
21c00 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
21c10 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
21c20 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m1);.        rc 
21c30 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  = -sqlite3IntFlo
21c40 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e  atCompare(pRhs->
21c50 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a  u.i, mem1.u.r);.
21c60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21c70 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76       i64 lhs = v
21c80 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
21c90 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  nt(serial_type, 
21ca0 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20  &aKey1[d1]);.   
21cb0 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70       i64 rhs = p
21cc0 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
21cd0 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b    if( lhs<rhs ){
21ce0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21cf0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
21d00 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b  e if( lhs>rhs ){
21d10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21d20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
21d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21d40 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20   /* RHS is real 
21d50 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
21d60 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
21d70 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
21d80 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
21d90 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
21da0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21db0 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
21dc0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20  /* Serial types 
21dd0 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72  12 or greater ar
21de0 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c  e strings and bl
21df0 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61  obs (greater tha
21e00 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  n.        ** num
21e10 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20  bers). Types 10 
21e20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65  and 11 are curre
21e30 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66  ntly "reserved f
21e40 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20  or future .     
21e50 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69     ** use", so i
21e60 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79  t doesn't really
21e70 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
21e80 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
21e90 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  aring.        **
21ea0 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69   them to numberi
21eb0 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a  c values are.  *
21ec0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  /.        rc = +
21ed0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
21ee0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
21ef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
21f00 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
21f10 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
21f20 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
21f30 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
21f40 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
21f50 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72  .        if( ser
21f60 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
21f70 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d           if( mem
21f80 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20  1.u.r<pRhs->u.r 
21f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
21fa0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
21fb0 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31    }else if( mem1
21fc0 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r>pRhs->u.r )
21fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
21fe0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20   = +1;.         
21ff0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
22000 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22010 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
22020 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69  Compare(mem1.u.i
22030 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20  , pRhs->u.r);.  
22040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
22060 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
22070 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
22080 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
22090 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
220a0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
220b0 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
220c0 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
220d0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
220e0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
220f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
22100 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22110 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
22120 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
22130 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
22140 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
22150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22160 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
22170 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
22180 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
22190 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
221a0 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
221b0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
221c0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
221d0 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
221e0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
221f0 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
22200 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
22210 4b 65 79 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  Key1.         ||
22220 20 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   (pKeyInfo = pPK
22230 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e  ey2->pKeyInfo)->
22240 6e 41 6c 6c 46 69 65 6c 64 3c 3d 69 0a 20 20 20  nAllField<=i.   
22250 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22260 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
22270 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
22280 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
22290 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
222c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
222d0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  f( pKeyInfo->aCo
222e0 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
222f0 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b     mem1.enc = pK
22300 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
22310 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d         mem1.db =
22320 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
22330 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c           mem1.fl
22340 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ags = MEM_Str;. 
22350 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20           mem1.z 
22360 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  = (char*)&aKey1[
22370 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d1];.          r
22380 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  c = vdbeCompareM
22390 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  emString(.      
223a0 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70          &mem1, p
223b0 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  Rhs, pKeyInfo->a
223c0 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32  Coll[i], &pPKey2
223d0 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
223e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
223f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22400 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d  int nCmp = MIN(m
22410 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b  em1.n, pRhs->n);
22420 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22430 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
22440 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
22450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22460 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65   rc==0 ) rc = me
22470 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20  m1.n - pRhs->n; 
22480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22490 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
224a0 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a   RHS is a blob *
224b0 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
224c0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
224d0 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61  _Blob ){.      a
224e0 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c  ssert( (pRhs->fl
224f0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
22500 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30  =0 || pRhs->n==0
22510 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72   );.      getVar
22520 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
22530 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
22540 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22550 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
22560 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
22570 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
22580 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
22590 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
225a0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
225b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
225c0 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
225d0 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
225e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
225f0 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
22600 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
22610 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
22620 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
22630 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
22640 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
22650 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
22660 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
22670 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
22680 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
22690 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
226a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
226b0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
226c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
226d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
226e0 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e  }else if( pRhs->
226f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
22700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
22710 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f  ( !isAllZero((co
22720 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31  nst char*)&aKey1
22730 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20  [d1],nStr) ){.  
22740 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
22750 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
22760 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
22770 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
22780 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
22790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
227a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
227b0 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
227c0 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
227d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
227e0 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
227f0 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
22800 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
22810 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
22820 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
22830 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22840 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
22850 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
22860 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
22870 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
22880 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
22890 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
228a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
228b0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
228c0 69 6e 74 20 73 6f 72 74 46 6c 61 67 73 20 3d 20  int sortFlags = 
228d0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
228e0 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 3b  ->aSortFlags[i];
228f0 0a 20 20 20 20 20 20 69 66 28 20 73 6f 72 74 46  .      if( sortF
22900 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
22910 69 66 28 20 28 73 6f 72 74 46 6c 61 67 73 20 26  if( (sortFlags &
22920 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 42   KEYINFO_ORDER_B
22930 49 47 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  IGNULL)==0.     
22940 20 20 20 20 7c 7c 20 28 28 73 6f 72 74 46 6c 61      || ((sortFla
22950 67 73 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44  gs & KEYINFO_ORD
22960 45 52 5f 44 45 53 43 29 0a 20 20 20 20 20 20 20  ER_DESC).       
22970 20 20 20 20 21 3d 28 73 65 72 69 61 6c 5f 74 79      !=(serial_ty
22980 70 65 3d 3d 30 20 7c 7c 20 28 70 52 68 73 2d 3e  pe==0 || (pRhs->
22990 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 29  flags&MEM_Null))
229a0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
229b0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
229c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
229d0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
229e0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
229f0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
22a00 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63  Key1, pPKey2, rc
22a10 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
22a20 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
22a30 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
22a40 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
22a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22a60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
22a70 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 50 4b 65  .    if( i==pPKe
22a80 79 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  y2->nField ) bre
22a90 61 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a  ak;.    pRhs++;.
22aa0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
22ab0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
22ac0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
22ad0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c  .    idx1 += sql
22ae0 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65  ite3VarintLen(se
22af0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77  rial_type);.  }w
22b00 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69  hile( idx1<(unsi
22b10 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 64  gned)szHdr1 && d
22b20 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
22b30 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
22b40 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
22b50 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
22b60 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
22b70 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
22b80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
22b90 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
22ba0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
22bb0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
22bc0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
22bd0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
22be0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
22bf0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
22c00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
22c10 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
22c20 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
22c30 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
22c40 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
22c50 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
22c60 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
22c70 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
22c80 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
22c90 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
22ca0 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
22cb0 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
22cc0 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
22cd0 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
22ce0 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  | vdbeRecordComp
22cf0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
22d00 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70  pKey1, pPKey2, p
22d10 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
22d20 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  c) .       || pP
22d30 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
22d40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22d50 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e  .  );.  pPKey2->
22d60 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65  eqSeen = 1;.  re
22d70 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
22d80 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73  ault_rc;.}.int s
22d90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22da0 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
22db0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
22dc0 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
22dd0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
22de0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
22df0 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2          /* R
22e00 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
22e10 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
22e20 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22e30 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
22e40 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
22e50 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
22e60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
22e70 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
22e80 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
22e90 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
22ea0 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
22eb0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
22ec0 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e   pPKey2 is an in
22ed0 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74  teger, and (b) t
22ee0 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68  he .** size-of-h
22ef0 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20  eader varint at 
22f00 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
22f10 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
22f20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62  in a single.** b
22f30 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73  yte (i.e. is les
22f40 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a  s than 128)..**.
22f50 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63  ** To avoid conc
22f60 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65  erns about buffe
22f70 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69  r overreads, thi
22f80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
22f90 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68  y used.** on sch
22fa0 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d  emas where the m
22fb0 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61  aximum valid hea
22fc0 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62  der size is 63 b
22fd0 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  ytes or less..*/
22fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
22ff0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
23000 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
23010 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
23020 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
23030 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
23040 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
23050 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
23060 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
23070 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20  aKey = &((const 
23080 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e  u8*)pKey1)[*(con
23090 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30  st u8*)pKey1 & 0
230a0 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69  x3F];.  int seri
230b0 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73  al_type = ((cons
230c0 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b  t u8*)pKey1)[1];
230d0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33  .  int res;.  u3
230e0 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20  2 y;.  u64 x;.  
230f0 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73  i64 v;.  i64 lhs
23100 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
23110 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
23120 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
23130 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
23140 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
23150 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
23160 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
23170 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
23180 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
23190 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
231a0 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
231b0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
231c0 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
231d0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
231e0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
231f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23200 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
23210 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
23220 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
23230 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
23240 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
23250 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
23260 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
23270 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
23280 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
23290 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
232a0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
232b0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
232c0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
232d0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
232e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
232f0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
23300 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
23310 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
23320 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
23330 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
23340 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
23350 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
23360 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
23370 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23380 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
23390 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
233a0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
233b0 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
233c0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
233d0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
233e0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
233f0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
23400 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
23410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23420 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
23430 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
23440 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
23450 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
23460 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
23470 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
23480 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
23490 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
234a0 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
234b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
234c0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
234d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
234e0 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
234f0 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
23500 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
23510 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
23520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
23530 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
23540 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
23550 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
23560 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
23570 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
23580 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
23590 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
235a0 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
235b0 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
235c0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
235d0 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
235e0 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
235f0 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
23600 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
23610 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
23620 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
23630 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
23640 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
23650 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
23660 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
23670 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
23680 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
23690 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
236a0 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
236b0 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
236c0 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
236d0 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
236e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
236f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
23700 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
23710 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
23720 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
23730 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
23740 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
23750 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
23760 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65  .  }..  v = pPKe
23770 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b  y2->aMem[0].u.i;
23780 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
23790 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
237a0 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
237b0 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
237c0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
237d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
237e0 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
237f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
23800 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
23810 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
23820 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
23830 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
23840 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
23850 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
23860 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
23870 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
23880 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
23890 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
238a0 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
238b0 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
238c0 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
238d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
238e0 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
238f0 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
23900 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
23910 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
23920 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
23930 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
23940 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
23950 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  n = 1;.  }..  as
23960 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
23970 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
23980 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
23990 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74  2, res) );.  ret
239a0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
239b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
239c0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
239d0 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
239e0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
239f0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
23a00 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
23a10 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
23a20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
23a30 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
23a40 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
23a50 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
23a60 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
23a70 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
23a80 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
23a90 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
23aa0 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
23ab0 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
23ac0 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
23ad0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
23ae0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
23af0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
23b00 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
23b10 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
23b20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
23b30 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
23b40 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
23b50 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
23b60 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  ey1 = (const u8*
23b70 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65  )pKey1;.  int se
23b80 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74  rial_type;.  int
23b90 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   res;..  assert(
23ba0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
23bb0 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  .flags & MEM_Str
23bc0 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74   );.  vdbeAssert
23bd0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
23be0 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
23bf0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
23c00 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72  yInfo);.  getVar
23c10 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
23c20 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
23c30 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
23c40 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  <12 ){.    res =
23c50 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20   pPKey2->r1;    
23c60 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
23c70 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  1) is a number o
23c80 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65  r a null */.  }e
23c90 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
23ca0 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
23cb0 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65   .    res = pPKe
23cc0 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20  y2->r2;      /* 
23cd0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
23ce0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c   a blob */.  }el
23cf0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70  se{.    int nCmp
23d00 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a  ;.    int nStr;.
23d10 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20      int szHdr = 
23d20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e  aKey1[0];..    n
23d30 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
23d40 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20  pe-12) / 2;.    
23d50 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74  if( (szHdr + nSt
23d60 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20  r) > nKey1 ){.  
23d70 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
23d80 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
23d90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23da0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
23db0 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
23dc0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d  */.    }.    nCm
23dd0 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
23de0 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
23df0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
23e00 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
23e10 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
23e20 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
23e30 20 20 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a     if( res>0 ){.
23e40 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
23e50 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
23e60 65 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20  e if( res<0 ){. 
23e70 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
23e80 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r1;.    }else
23e90 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53  {.      res = nS
23ea0 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65  tr - pPKey2->aMe
23eb0 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66  m[0].n;.      if
23ec0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
23ed0 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e      if( pPKey2->
23ee0 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
23ef0 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69        res = sqli
23f00 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
23f10 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
23f20 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
23f30 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  2, 1);.        }
23f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23f50 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
23f60 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20  fault_rc;.      
23f70 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65      pPKey2->eqSe
23f80 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
23f90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
23fa0 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
23fb0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
23fc0 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r2;.      }else
23fd0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
23fe0 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
23ff0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
24000 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
24010 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
24020 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
24030 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20  Key2, res).     
24040 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a    || CORRUPT_DB.
24050 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32         || pPKey2
24060 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ->pKeyInfo->db->
24070 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
24080 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
24090 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
240a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
240b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
240c0 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61  dCompare() compa
240d0 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  tible function.*
240e0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63  * suitable for c
240f0 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69  omparing seriali
24100 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74  zed records to t
24110 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
24120 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  rd passed.** as 
24130 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
24140 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70  t..*/.RecordComp
24150 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46  are sqlite3VdbeF
24160 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63  indCompare(Unpac
24170 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
24180 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64   /* varintRecord
24190 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
241a0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
241b0 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74  pareString() bot
241c0 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68  h assume.  ** th
241d0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
241e0 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61  eader varint tha
241f0 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
24200 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65  start of each re
24210 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69  cord.  ** fits i
24220 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
24230 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20  (i.e. is 127 or 
24240 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63  less). varintRec
24250 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a  ordCompareInt().
24260 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65    ** also assume
24270 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
24280 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20  e to overread a 
24290 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61  buffer by at lea
242a0 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78  st the .  ** max
242b0 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65  imum possible le
242c0 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  gal header size 
242d0 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65  plus 8 bytes. Be
242e0 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20  cause there is. 
242f0 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
24300 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34  o be at least 74
24310 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62   (but not 136) b
24320 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
24330 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20  following each. 
24340 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
24350 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72  d to varintRecor
24360 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68  dCompareInt() th
24370 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76  is makes it conv
24380 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c  enient to.  ** l
24390 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
243a0 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36   the header to 6
243b0 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73  4 bytes in cases
243c0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
243d0 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61   field.  ** is a
243e0 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a  n integer..  **.
243f0 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74    ** The easiest
24400 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20   way to enforce 
24410 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f  this limit is to
24420 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72   consider only r
24430 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a  ecords with.  **
24440 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65   13 fields or le
24450 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  ss. If the first
24460 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74   field is an int
24470 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75  eger, the maximu
24480 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61  m legal.  ** hea
24490 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a  der size is (12*
244a0 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73  5 + 1 + 1) bytes
244b0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
244c0 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
244d0 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e  ld<=13 ){.    in
244e0 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65  t flags = p->aMe
244f0 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20  m[0].flags;.    
24500 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
24510 3e 61 53 6f 72 74 46 6c 61 67 73 5b 30 5d 20 29  >aSortFlags[0] )
24520 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
24530 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c  KeyInfo->aSortFl
24540 61 67 73 5b 30 5d 20 26 20 4b 45 59 49 4e 46 4f  ags[0] & KEYINFO
24550 5f 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 20 29  _ORDER_BIGNULL )
24560 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
24570 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
24580 72 64 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  rdCompare;.     
24590 20 7d 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d   }.      p->r1 =
245a0 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
245b0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
245c0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
245d0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
245e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
245f0 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
24600 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
24610 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
24620 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
24630 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
24640 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
24650 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24660 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
24670 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
24680 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
24690 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
246a0 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
246b0 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d 45 4d  |MEM_IntReal|MEM
246c0 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
246d0 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 2d 3e 70  ==0.     && p->p
246e0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
246f0 5d 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  ]==0.    ){.    
24700 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
24710 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20  & MEM_Str );.   
24720 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
24730 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
24740 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
24750 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
24760 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b  beRecordCompare;
24770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  .}../*.** pCur p
24780 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
24790 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
247a0 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
247b0 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
247c0 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
247d0 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
247e0 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
247f0 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
24800 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
24810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
24820 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
24830 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
24840 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
24850 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
24860 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
24870 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
24880 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
24890 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
248a0 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
248b0 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
248c0 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
248d0 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
248e0 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
248f0 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
24900 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74  (sqlite3 *db, Bt
24910 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
24920 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
24930 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
24940 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
24950 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
24960 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
24970 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
24980 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
24990 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
249a0 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
249b0 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
249c0 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
249d0 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
249e0 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73  ..  /* Get the s
249f0 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
24a00 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e   entry.  Only in
24a10 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66  dices entries of
24a20 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
24a30 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74  2GiB are support
24a40 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67   - anything larg
24a50 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61  e must be databa
24a60 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
24a70 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69   ** Any corrupti
24a80 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69  on is detected i
24a90 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n sqlite3BtreePa
24aa0 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68  rseCellPtr(), th
24ab0 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68  ough, so.  ** th
24ac0 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65  is code can safe
24ad0 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e  ly assume that n
24ae0 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69  CellKey is 32-bi
24af0 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts  .  */.  asse
24b00 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
24b10 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
24b20 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65  ur) );.  nCellKe
24b30 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  y = sqlite3Btree
24b40 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72  PayloadSize(pCur
24b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  );.  assert( (nC
24b60 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
24b70 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
24b80 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
24b90 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
24ba0 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
24bb0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
24bc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
24bd0 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
24be0 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
24bf0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
24c00 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
24c10 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b  2)nCellKey, &m);
24c20 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
24c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24c40 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
24c50 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
24c60 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
24c70 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
24c80 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
24c90 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
24ca0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
24cb0 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
24cc0 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
24cd0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
24ce0 3e 30 78 37 66 66 66 66 66 66 66 20 29 3b 0a 20  >0x7fffffff );. 
24cf0 20 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d 30 20   assert( m.n>=0 
24d00 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
24d10 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73 7a 48  y(szHdr<3 || szH
24d20 64 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d 2e 6e  dr>(unsigned)m.n
24d30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
24d40 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
24d50 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
24d60 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
24d70 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
24d80 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
24d90 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
24da0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
24db0 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
24dc0 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
24dd0 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
24de0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
24df0 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
24e00 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
24e10 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
24e20 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
24e30 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
24e40 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
24e50 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
24e60 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
24e70 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
24e80 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
24e90 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
24ea0 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
24eb0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
24ec0 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
24ed0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
24ee0 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
24ef0 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
24f00 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
24f10 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
24f20 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
24f30 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
24f40 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
24f50 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d  owid = sqlite3Sm
24f60 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70  allTypeSizes[typ
24f70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63  eRowid];.  testc
24f80 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
24f90 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
24fa0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
24fb0 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
24fc0 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
24fd0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
24fe0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
24ff0 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
25000 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
25010 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
25020 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
25030 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
25040 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
25050 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
25060 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
25070 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
25080 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
25090 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
250a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
250b0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
250c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
250d0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
250e0 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
250f0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
25100 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
25110 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
25120 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
25130 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
25140 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
25150 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
25160 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
25170 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
25180 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25190 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
251a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
251b0 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
251c0 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
251d0 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
251e0 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
251f0 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
25200 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
25210 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
25220 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
25230 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
25240 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
25250 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
25260 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
25270 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
25280 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
25290 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
252a0 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
252b0 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
252c0 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
252d0 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
252e0 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
252f0 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
25300 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
25310 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
25320 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
25330 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
25340 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
25350 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
25360 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
25370 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
25380 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
25390 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
253a0 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
253b0 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
253c0 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
253d0 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
253e0 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
253f0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
25400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25410 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
25420 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
25430 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
25440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25450 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
25460 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
25470 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
25480 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
25490 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
254a0 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
254b0 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
254e0 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
254f0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
25500 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
25510 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
25520 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d  sor *pCur;.  Mem
25530 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   m;..  assert( p
25540 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
25550 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
25560 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  pCur = pC->uc.pC
25570 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
25580 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
25590 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
255a0 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
255b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
255c0 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
255d0 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
255e0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
255f0 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
25600 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
25610 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
25620 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
25630 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
25640 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
25650 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
25660 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
25670 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
25680 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
25690 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
256a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
256b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
256c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
256d0 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
256e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
256f0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
25700 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
25710 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20  CellKey, &m);.  
25720 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
25730 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
25740 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
25750 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
25760 74 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c  thSkip(m.n, m.z,
25770 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a   pUnpacked, 0);.
25780 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
25790 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
257a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
257b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
257c0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
257d0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
257e0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
257f0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
25800 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
25810 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25820 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
25830 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25840 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
25850 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
25860 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
25870 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25880 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
25890 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
258a0 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
258b0 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
258c0 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
258d0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
258e0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
258f0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
25900 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
25910 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
25920 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
25930 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
25940 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
25950 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
25960 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
25970 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
25980 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
25990 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
259a0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
259b0 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
259c0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
259d0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
259e0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
259f0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
25a00 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
25a10 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
25a20 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
25a30 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
25a40 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
25a50 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
25a60 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
25a70 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
25a80 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
25a90 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
25aa0 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
25ab0 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
25ac0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
25ad0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
25ae0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
25af0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
25b00 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a  ts obsolete..**.
25b10 2a 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20 31  ** If iCode is 1
25b20 2c 20 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f  , then expiratio
25b30 6e 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  n is advisory.  
25b40 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68  The statement sh
25b50 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65  ould.** be repre
25b60 70 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  pared before bei
25b70 6e 67 20 72 65 73 74 61 72 74 65 64 2c 20 62 75  ng restarted, bu
25b80 74 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  t if it is alrea
25b90 64 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74  dy running.** it
25ba0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72   is allowed to r
25bb0 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
25bc0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c  ..**.** Internal
25bd0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
25be0 6e 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  n just sets the 
25bf0 56 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61  Vdbe.expired fla
25c00 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70  g on all.** prep
25c10 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  ared statements.
25c20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65    The flag is se
25c30 74 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d  t to 1 for an im
25c40 6d 65 64 69 61 74 65 20 65 78 70 69 72 61 74 69  mediate expirati
25c50 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f  on.** and set to
25c60 20 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f   2 for an adviso
25c70 72 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a  ry expiration..*
25c80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25c90 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
25ca0 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
25cb0 64 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a  db, int iCode){.
25cc0 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
25cd0 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
25ce0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
25cf0 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
25d00 20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a   iCode+1;.  }.}.
25d10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25d20 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
25d30 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
25d40 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
25d50 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
25d60 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
25d70 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
25d80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c  * Return the SQL
25d90 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67  ITE_PREPARE flag
25da0 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f  s for a Vdbe..*/
25db0 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50  .u8 sqlite3VdbeP
25dc0 72 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65  repareFlags(Vdbe
25dd0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
25de0 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a  ->prepFlags;.}..
25df0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
25e00 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
25e10 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
25e20 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
25e30 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
25e40 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
25e50 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
25e60 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
25e70 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
25e80 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
25e90 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
25ea0 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
25eb0 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
25ec0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
25ed0 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
25ee0 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
25ef0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25f00 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
25f10 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
25f20 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
25f30 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
25f40 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
25f50 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
25f60 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
25f70 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
25f80 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
25f90 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
25fa0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
25fb0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
25fc0 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
25fd0 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
25fe0 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
25ff0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
26000 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
26010 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
26020 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
26030 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
26040 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
26050 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
26060 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
26070 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
26080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26090 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
260a0 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
260b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
260c0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
260d0 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
260e0 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
260f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
26100 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
26110 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
26120 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
26130 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
26140 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
26150 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
26160 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
26170 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
26180 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
26190 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
261a0 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
261b0 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
261c0 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
261d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
261e0 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
261f0 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
26200 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
26210 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d   assert( (v->db-
26220 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
26230 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29  EnableQPSG)==0 )
26240 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32  ;.  if( iVar>=32
26250 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
26260 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30  sk |= 0x80000000
26270 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
26280 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75  ->expmask |= ((u
26290 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29  32)1 << (iVar-1)
262a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
262b0 43 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e  Cause a function
262c0 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72   to throw an err
262d0 6f 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c  or if it was cal
262e0 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75  l from OP_PureFu
262f0 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  nc.** rather tha
26300 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a  n OP_Function..*
26310 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63  *.** OP_PureFunc
26320 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
26330 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
26340 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20   deterministic, 
26350 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68  and should.** th
26360 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
26370 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75  it is given inpu
26380 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  ts that would ma
26390 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d  ke it non-determ
263a0 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73  inistic..** This
263b0 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
263c0 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65  ked by date/time
263d0 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
263e0 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  use non-determin
263f0 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65  istic.** feature
26400 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e  s such as 'now'.
26410 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  .*/.int sqlite3N
26420 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74  otPureFunc(sqlit
26430 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
26440 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
26450 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
26460 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 3d  if( pCtx->pVdbe=
26470 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23  =0 ) return 1;.#
26480 65 6e 64 69 66 0a 20 20 69 66 28 20 70 43 74 78  endif.  if( pCtx
26490 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74  ->pVdbe->aOp[pCt
264a0 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d  x->iOp].opcode==
264b0 4f 50 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a 20  OP_PureFunc ){. 
264c0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
264d0 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
264e0 20 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72        "non-deter
264f0 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
26500 6e 20 69 6e 20 69 6e 64 65 78 20 65 78 70 72 65  n in index expre
26510 73 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63  ssion or CHECK c
26520 6f 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20 20 20  onstraint",.    
26530 20 20 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75     -1);.    retu
26540 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
26550 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 1;.}..#ifndef
26560 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
26570 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
26580 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
26590 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
265a0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
265b0 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
265c0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
265d0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
265e0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
265f0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
26600 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
26610 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
26620 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
26630 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
26640 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
26650 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
26660 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
26670 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
26680 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
26690 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
266a0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
266b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
266c0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
266d0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
266e0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
266f0 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
26700 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
26710 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
26720 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
26730 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
26740 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
26750 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
26760 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
26770 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26780 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
26790 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
267a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
267b0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
267c0 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
267d0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
267e0 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
267f0 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
26800 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
26810 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
26820 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
26830 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
26840 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
26850 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
26860 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26870 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
26880 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
26890 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
268a0 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
268b0 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
268c0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
268d0 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
268e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
268f0 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
26900 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
26910 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52  Field, UnpackedR
26920 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
26930 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
26940 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26950 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
26960 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
26970 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20  &p->aMem[i];.   
26980 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61     if( pMem->zMa
26990 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64  lloc ) sqlite3Vd
269a0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
269b0 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  m);.    }.    sq
269c0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
269d0 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , p);.  }.}.#end
269e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
269f0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
26a00 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OK */..#ifdef SQ
26a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
26a20 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a  PDATE_HOOK./*.**
26a30 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
26a40 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20  update hook. If 
26a50 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
26a60 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d  E or DELETE pre-
26a70 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20  update call,.** 
26a80 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73  then cursor pass
26a90 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
26aa0 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
26ab0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
26ac0 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65  w about.** to be
26ad0 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
26ae0 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69  ed. If the appli
26af0 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  cation calls sql
26b00 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f  ite3_preupdate_o
26b10 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71  ld(),.** the req
26b20 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c  uired value will
26b30 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
26b40 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
26b50 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76   points to..*/.v
26b60 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
26b70 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20  reUpdateHook(.  
26b80 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61  /* Vdbe pre-upda
26bb0 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te hook is invok
26bc0 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43  ed by */.  VdbeC
26bd0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
26be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
26bf0 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64  rsor to grab old
26c00 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a  .* values from *
26c10 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c30 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
26c40 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
26c50 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73  DELETE */.  cons
26c60 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
26c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
26c80 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
26c90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61    /* Modified ta
26cc0 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65  ble */.  i64 iKe
26cd0 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y1,             
26ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
26cf0 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f  ial key value */
26d00 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
26d30 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20  or new.* record 
26d40 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
26d50 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69  *db = v->db;.  i
26d60 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55  64 iKey2;.  PreU
26d70 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b  pdate preupdate;
26d80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26d90 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tbl = pTab->zNam
26da0 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  e;.  static cons
26db0 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64  t u8 fakeSortOrd
26dc0 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  er = 0;..  asser
26dd0 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
26de0 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e==0 );.  memset
26df0 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20  (&preupdate, 0, 
26e00 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65  sizeof(PreUpdate
26e10 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77  ));.  if( HasRow
26e20 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20  id(pTab)==0 ){. 
26e30 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32     iKey1 = iKey2
26e40 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64   = 0;.    preupd
26e50 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65  ate.pPk = sqlite
26e60 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
26e70 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
26e80 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
26e90 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  ITE_UPDATE ){.  
26ea0 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
26eb0 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
26ec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26ed0 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey2 = iKey1;. 
26ee0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
26ef0 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64  rt( pCsr->nField
26f00 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20  ==pTab->nCol .  
26f10 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e       || (pCsr->n
26f20 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f  Field==pTab->nCo
26f30 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54  l+1 && op==SQLIT
26f40 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67  E_DELETE && iReg
26f50 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72  ==-1).  );..  pr
26f60 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20  eupdate.v = v;. 
26f70 20 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20   preupdate.pCsr 
26f80 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64  = pCsr;.  preupd
26f90 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ate.op = op;.  p
26fa0 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67  reupdate.iNewReg
26fb0 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70   = iReg;.  preup
26fc0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20  date.keyinfo.db 
26fd0 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74  = db;.  preupdat
26fe0 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20  e.keyinfo.enc = 
26ff0 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70  ENC(db);.  preup
27000 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
27010 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  yField = pTab->n
27020 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
27030 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 46 6c  .keyinfo.aSortFl
27040 61 67 73 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  ags = (u8*)&fake
27050 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
27060 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
27070 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
27080 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
27090 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61  .  preupdate.pTa
270a0 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d  b = pTab;..  db-
270b0 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
270c0 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
270d0 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
270e0 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
270f0 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
27100 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
27110 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
27120 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
27130 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27140 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
27150 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
27160 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
27170 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
27180 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75  KeyField+1, preu
27190 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
271a0 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
271b0 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
271c0 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46  te.keyinfo.nKeyF
271d0 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74  ield+1, preupdat
271e0 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b  e.pNewUnpacked);
271f0 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65  .  if( preupdate
27200 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  .aNew ){.    int
27210 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
27220 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b   i<pCsr->nField;
27230 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
27240 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
27250 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e  se(&preupdate.aN
27260 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
27270 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
27280 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  N(db, preupdate.
27290 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  aNew);.  }.}.#en
272a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
272b0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
272c0 4f 4f 4b 20 2a 2f 0a                             OOK */.