/ Hex Artifact Content
Login

Artifact 2f4fefdf74c484193de632c3c417c5886512f7a57f69a65dbdb858a58bc3f55a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 76 2d 3e   int nNew = (v->
1180: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
1190: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  v->nOpAlloc*2 : 
11a0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
11c0: 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (v->nOpAllo
11d0: 63 20 3f 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? v->nOpAlloc*
11e0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
11f0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
1200: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1210: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
1220: 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  /* Ensure that t
1230: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 56 44 42  he size of a VDB
1240: 45 20 64 6f 65 73 20 6e 6f 74 20 67 72 6f 77 20  E does not grow 
1250: 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20 20 69  too large */.  i
1260: 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e 64 62 2d  f( nNew > p->db-
1270: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1280: 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 20 29 7b  IMIT_VDBE_OP] ){
1290: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
12a0: 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  ault(p->db);.   
12b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12c0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  OMEM;.  }..  ass
12d0: 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f  ert( nOp<=(1024/
12e0: 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20  sizeof(Op)) );. 
12f0: 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28   assert( nNew>=(
1300: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
1310: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
1320: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
1330: 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65  >db, v->aOp, nNe
1340: 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  w*sizeof(Op));. 
1350: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1360: 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20   p->szOpAlloc = 
1370: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1380: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
1390: 3b 0a 20 20 20 20 76 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    v->nOpAllo
13a0: 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  c = p->szOpAlloc
13b0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
13c0: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
13d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
13e0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
13f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1400: 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  PT);.}..#ifdef S
1410: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
1420: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
1430: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
1440: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1450: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
1460: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
1470: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
1480: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
1490: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
14a0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
14b0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
14c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
14d0: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
14e0: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
14f0: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
1500: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
1510: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1520: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
1530: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
1540: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
1550: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
1560: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
1570: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
1580: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
1590: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
15a0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
15b0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
15c0: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
15d0: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
15e0: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
15f0: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
1600: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
1610: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
1620: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
1630: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
1640: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
1650: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
1660: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
1670: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
1680: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
1690: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
16a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
16b0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
16c0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
16d0: 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f  INLINE int growO
16e0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
16f0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1700: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61  p2, int p3){.  a
1710: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
1720: 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  oc<=p->nOp );.  
1730: 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28  if( growOpArray(
1740: 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 31  p, 1) ) return 1
1750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
1760: 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29  OpAlloc>p->nOp )
1770: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1790: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
17a0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
17b0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
17c0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
17d0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
17e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
17f0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
1800: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
1810: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1820: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1830: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30  .  assert( op>=0
1840: 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20   && op<0xff );. 
1850: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
1860: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=i ){.    retur
1870: 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c  n growOp3(p, op,
1880: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1890: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
18a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
18b0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
18c0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d  = (u8)op;.  pOp-
18d0: 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p5 = 0;.  pOp->
18e0: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
18f0: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
1900: 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e  p3 = p3;.  pOp->
1910: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.p = 0;.  pOp-
1920: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
1930: 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c  USED;.#ifdef SQL
1940: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
1950: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f  IN_COMMENTS.  pO
1960: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  p->zComment = 0;
1970: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1980: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1990: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
19a0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
19b0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pTrace ){.    sq
19c0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
19d0: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
19e0: 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64  ]);.    test_add
19f0: 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  op_breakpoint();
1a00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
1a10: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
1a20: 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20    pOp->cycles = 
1a30: 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20  0;.  pOp->cnt = 
1a40: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1a50: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1a60: 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72  ERAGE.  pOp->iSr
1a70: 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69  cLine = 0;.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1a90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1aa0: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1ab0: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad0: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1ae0: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1af0: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1b00: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1b10: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
1b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b30: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
1b40: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1b50: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
1b60: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1b70: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1b80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1b90: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1ba0: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  1, p2, 0);.}../*
1bb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1bc0: 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  or an unconditio
1bd0: 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  nal jump to inst
1be0: 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f  ruction iDest.*/
1bf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1c00: 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e  Goto(Vdbe *p, in
1c10: 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75  t iDest){.  retu
1c20: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1c30: 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp3(p, OP_Goto,
1c40: 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d   0, iDest, 0);.}
1c50: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1c60: 64 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  de to cause the 
1c70: 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62  string zStr to b
1c80: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a  e loaded into.**
1c90: 20 72 65 67 69 73 74 65 72 20 69 44 65 73 74 0a   register iDest.
1ca0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1cb0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62  beLoadString(Vdb
1cc0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
1ce0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
1cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1d00: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
1d10: 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c   iDest, 0, zStr,
1d20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
1d30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1d40: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c   initializes mul
1d50: 74 69 70 6c 65 20 72 65 67 69 73 74 65 72 73 20  tiple registers 
1d60: 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74  to string or int
1d70: 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  eger.** constant
1d80: 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
1d90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 69 44 65  s begin with iDe
1da0: 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20  st and increase 
1db0: 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a  consecutively..*
1dc0: 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69  * One register i
1dd0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f  s initialized fo
1de0: 72 20 65 61 63 68 20 63 68 61 72 61 63 67 74 65  r each characgte
1df0: 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20  r in zTypes[].  
1e00: 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20  For each.** "s" 
1e10: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79  character in zTy
1e20: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1e30: 74 65 72 20 69 73 20 61 20 73 74 72 69 6e 67 20  ter is a string 
1e40: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1e50: 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20  is.** not NULL, 
1e60: 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68  or OP_Null if th
1e70: 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c  e value is a nul
1e80: 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20  l pointer.  For 
1e90: 65 61 63 68 20 22 69 22 20 63 68 61 72 61 63 74  each "i" charact
1ea0: 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b  er.** in zTypes[
1eb0: 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ], the register 
1ec0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1ed0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  o an integer..**
1ee0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
1ef0: 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74   string does not
1f00: 20 65 6e 64 20 77 69 74 68 20 22 58 22 20 74 68   end with "X" th
1f10: 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52  en an OP_ResultR
1f20: 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  ow instruction.*
1f30: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  * is generated f
1f40: 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  or the values in
1f50: 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  serted..*/.void 
1f60: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
1f70: 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  Load(Vdbe *p, in
1f80: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
1f90: 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e  har *zTypes, ...
1fa0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1fb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1fc0: 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   c;.  va_start(a
1fd0: 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f  p, zTypes);.  fo
1fe0: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70  r(i=0; (c = zTyp
1ff0: 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  es[i])!=0; i++){
2000: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20  .    if( c=='s' 
2010: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2020: 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28  har *z = va_arg(
2030: 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
2040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2050: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d  dbeAddOp4(p, z==
2060: 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50  0 ? OP_Null : OP
2070: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65  _String8, 0, iDe
2080: 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a  st+i, 0, z, 0);.
2090: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
20a0: 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 73 71  ='i' ){.      sq
20b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20c0: 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76  p, OP_Integer, v
20d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20  a_arg(ap, int), 
20e0: 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20 7d 65  iDest+i);.    }e
20f0: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
2100: 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f  skip_op_resultro
2110: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  w;.    }.  }.  s
2120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2130: 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (p, OP_ResultRow
2140: 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73 6b 69  , iDest, i);.ski
2150: 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3a 0a  p_op_resultrow:.
2160: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
2170: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2180: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2190: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
21a0: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
21b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
21c0: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
21d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
21e0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
21f0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
2200: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
2210: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
2220: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
2230: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
2240: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
2250: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
2260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2270: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
2280: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
2290: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
22a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
22b0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
22c0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
22d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
22e0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
22f0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
2300: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
2310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2320: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
2330: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
2340: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
2350: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
2360: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
2370: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
2380: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2390: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
23a0: 61 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49  alue with a P4_I
23b0: 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45  NT64 or.** P4_RE
23c0: 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  AL type..*/.int 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23e0: 34 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70  4Dup8(.  Vdbe *p
23f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2400: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
2410: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
2420: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
2430: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
2440: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
2450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2460: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
2470: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
2480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2490: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
24a0: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
24b0: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
24c0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
24d0: 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f   u8 *zP4,      /
24e0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
2500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
2510: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
2520: 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70  ){.  char *p4cop
2530: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
2540: 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33  locRawNN(sqlite3
2550: 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20  VdbeDb(p), 8);. 
2560: 20 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65   if( p4copy ) me
2570: 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34  mcpy(p4copy, zP4
2580: 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 8);.  return s
2590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25a0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
25b0: 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79  p3, p4copy, p4ty
25c0: 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  pe);.}..#ifndef 
25d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
25e0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AIN./*.** Return
25f0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2600: 74 68 65 20 63 75 72 72 65 6e 74 20 45 58 50 4c  the current EXPL
2610: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 62  AIN QUERY PLAN b
2620: 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20 6d 65  aseline..** 0 me
2630: 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69  ans "none"..*/.i
2640: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  nt sqlite3VdbeEx
2650: 70 6c 61 69 6e 50 61 72 65 6e 74 28 50 61 72 73  plainParent(Pars
2660: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
2670: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
2680: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2690: 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  lain==0 ) return
26a0: 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69   0;.  pOp = sqli
26b0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 50 61  te3VdbeGetOp(pPa
26c0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
26d0: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29  se->addrExplain)
26e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
26f0: 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  p2;.}../*.** Set
2700: 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
2710: 6b 70 6f 69 6e 74 20 6f 6e 20 74 68 65 20 66 6f  kpoint on the fo
2720: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
2730: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d  in order to.** m
2740: 6f 6e 69 74 6f 72 20 74 68 65 20 45 58 50 4c 41  onitor the EXPLA
2750: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2760: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a  de generation..*
2770: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
2780: 4c 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64  LITE_DEBUG).void
2790: 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42   sqlite3ExplainB
27a0: 72 65 61 6b 70 6f 69 6e 74 28 63 6f 6e 73 74 20  reakpoint(const 
27b0: 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20  char *z1, const 
27c0: 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 28 76 6f  char *z2){.  (vo
27d0: 69 64 29 7a 31 3b 0a 20 20 28 76 6f 69 64 29 7a  id)z1;.  (void)z
27e0: 32 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  2;.}.#endif../*.
27f0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f  ** Add a new OP_
2800: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
2810: 66 20 74 68 65 20 62 50 75 73 68 20 66 6c 61 67  f the bPush flag
2820: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d   is true, then m
2830: 61 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ake this opcode 
2840: 74 68 65 20 70 61 72 65 6e 74 20 66 6f 72 0a 2a  the parent for.*
2850: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 45 78 70  * subsequent Exp
2860: 6c 61 69 6e 73 20 75 6e 74 69 6c 20 73 71 6c 69  lains until sqli
2870: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f  te3VdbeExplainPo
2880: 70 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  p() is called..*
2890: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
28a0: 62 65 45 78 70 6c 61 69 6e 28 50 61 72 73 65 20  beExplain(Parse 
28b0: 2a 70 50 61 72 73 65 2c 20 75 38 20 62 50 75 73  *pParse, u8 bPus
28c0: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
28d0: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 23 69 66 6e 64  Fmt, ...){.#ifnd
28e0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28f0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 69 6e 63 6c    /* Always incl
2900: 75 64 65 20 74 68 65 20 4f 50 5f 45 78 70 6c 61  ude the OP_Expla
2910: 69 6e 20 6f 70 63 6f 64 65 73 20 69 66 20 53 51  in opcodes if SQ
2920: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
2930: 66 69 6e 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  fined..  ** But 
2940: 6f 6d 69 74 20 74 68 65 6d 20 28 66 6f 72 20 70  omit them (for p
2950: 65 72 66 6f 72 6d 61 6e 63 65 29 20 64 75 72 69  erformance) duri
2960: 6e 67 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75  ng production bu
2970: 69 6c 64 73 20 2a 2f 0a 20 20 69 66 28 20 70 50  ilds */.  if( pP
2980: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2990: 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
29a0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
29b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76    Vdbe *v;.    v
29c0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69  a_list ap;.    i
29d0: 6e 74 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61  nt iThis;.    va
29e0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
29f0: 3b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  ;.    zMsg = sql
2a00: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61  ite3VMPrintf(pPa
2a10: 72 73 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61  rse->db, zFmt, a
2a20: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
2a30: 70 29 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72  p);.    v = pPar
2a40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69  se->pVdbe;.    i
2a50: 54 68 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  This = v->nOp;. 
2a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a70: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
2a80: 69 6e 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73  in, iThis, pPars
2a90: 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  e->addrExplain, 
2aa0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2ab0: 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50           zMsg, P
2ac0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
2ad0: 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 72  sqlite3ExplainBr
2ae0: 65 61 6b 70 6f 69 6e 74 28 62 50 75 73 68 3f 22  eakpoint(bPush?"
2af0: 50 55 53 48 22 3a 22 22 2c 20 73 71 6c 69 74 65  PUSH":"", sqlite
2b00: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
2b10: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28  ->p4.z);.    if(
2b20: 20 62 50 75 73 68 29 7b 0a 20 20 20 20 20 20 70   bPush){.      p
2b30: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
2b40: 69 6e 20 3d 20 69 54 68 69 73 3b 0a 20 20 20 20  in = iThis;.    
2b50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2b60: 6f 70 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  op the EXPLAIN Q
2b70: 55 45 52 59 20 50 4c 41 4e 20 73 74 61 63 6b 20  UERY PLAN stack 
2b80: 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  one level..*/.vo
2b90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  id sqlite3VdbeEx
2ba0: 70 6c 61 69 6e 50 6f 70 28 50 61 72 73 65 20 2a  plainPop(Parse *
2bb0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
2bc0: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2bd0: 69 6e 74 28 22 50 4f 50 22 2c 20 30 29 3b 0a 20  int("POP", 0);. 
2be0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2bf0: 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64  lain = sqlite3Vd
2c00: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2c10: 70 50 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69  pParse);.}.#endi
2c20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c30: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a  _EXPLAIN */../*.
2c40: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
2c50: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
2c60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2c70: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
2c80: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
2c90: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
2ca0: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
2cb0: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
2cc0: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
2cd0: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
2ce0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
2cf0: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
2d00: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
2d10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2d20: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
2d30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
2d40: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
2d50: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
2d60: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
2d70: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
2d80: 53 63 68 65 6d 61 4f 70 28 50 61 72 73 65 20 2a  SchemaOp(Parse *
2d90: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c  pParse, int iDb,
2da0: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
2db0: 20 20 56 64 62 65 20 2a 70 20 3d 20 70 50 61 72    Vdbe *p = pPar
2dc0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2dd0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   j;.  sqlite3Sch
2de0: 65 6d 61 57 72 69 74 61 62 6c 65 28 70 50 61 72  emaWritable(pPar
2df0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
2e00: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
2e10: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
2e20: 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65   iDb, 0, 0, zWhe
2e30: 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  re, P4_DYNAMIC);
2e40: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
2e50: 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73  >db->nDb; j++) s
2e60: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
2e70: 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a  ree(p, j);.}../*
2e80: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
2e90: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
2ea0: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
2eb0: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  an integer..*/.i
2ec0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
2ed0: 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65 20  dOp4Int(.  Vdbe 
2ee0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
2ef0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
2f00: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
2f10: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2f20: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2f30: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
2f40: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
2f50: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
2f60: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
2f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2f80: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
2f90: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
2fa0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
2fb0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2fc0: 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20 20   p4             
2fd0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
2fe0: 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  nd as an integer
2ff0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
3000: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3010: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
3020: 20 70 32 2c 20 70 33 29 3b 0a 20 20 69 66 28 20   p2, p3);.  if( 
3030: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3040: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  led==0 ){.    Vd
3050: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
3060: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70  aOp[addr];.    p
3070: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3080: 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f 70 2d 3e  INT32;.    pOp->
3090: 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20 7d 0a 20  p4.i = p4;.  }. 
30a0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
30b0: 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 65  ./* Insert the e
30c0: 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75 74 69  nd of a co-routi
30d0: 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ne.*/.void sqlit
30e0: 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
30f0: 6e 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ne(Vdbe *v, int 
3100: 72 65 67 59 69 65 6c 64 29 7b 0a 20 20 73 71 6c  regYield){.  sql
3110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3120: 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
3130: 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 0a 20  e, regYield);.. 
3140: 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 74 65   /* Clear the te
3150: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
3160: 20 63 61 63 68 65 2c 20 74 68 65 72 65 62 79 20   cache, thereby 
3170: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 65 61  ensuring that ea
3180: 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75 74 69  ch.  ** co-routi
3190: 6e 65 20 68 61 73 20 69 74 73 20 6f 77 6e 20 69  ne has its own i
31a0: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 74 20 6f  ndependent set o
31b0: 66 20 72 65 67 69 73 74 65 72 73 2c 20 62 65 63  f registers, bec
31c0: 61 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73  ause co-routines
31d0: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65 78 70 65  .  ** might expe
31e0: 63 74 20 74 68 65 69 72 20 72 65 67 69 73 74 65  ct their registe
31f0: 72 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76  rs to be preserv
3200: 65 64 20 61 63 72 6f 73 73 20 61 6e 20 4f 50 5f  ed across an OP_
3210: 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a 2a 20  Yield, and.  ** 
3220: 74 68 61 74 20 63 6f 75 6c 64 20 63 61 75 73 65  that could cause
3230: 20 70 72 6f 62 6c 65 6d 73 20 69 66 20 74 77 6f   problems if two
3240: 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f 75 74   or more co-rout
3250: 69 6e 65 73 20 61 72 65 20 75 73 69 6e 67 20 74  ines are using t
3260: 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74 65 6d  he same.  ** tem
3270: 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 2e  porary register.
3280: 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61 72 73  .  */.  v->pPars
3290: 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
32a0: 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 52  .  v->pParse->nR
32b0: 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a  angeReg = 0;.}..
32c0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
32d0: 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  ew symbolic labe
32e0: 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63  l for an instruc
32f0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65  tion that has ye
3300: 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64  t to be.** coded
3310: 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20  .  The symbolic 
3320: 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20  label is really 
3330: 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20  just a negative 
3340: 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20  number.  The.** 
3350: 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65  label can be use
3360: 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75  d as the P2 valu
3370: 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  e of an operatio
3380: 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a  n.  Later, when.
3390: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20  ** the label is 
33a0: 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70  resolved to a sp
33b0: 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20  ecific address, 
33c0: 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63  the VDBE will sc
33d0: 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74  an.** through it
33e0: 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74  s operation list
33f0: 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20   and change all 
3400: 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69  values of P2 whi
3410: 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20  ch match.** the 
3420: 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72  label into the r
3430: 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e  esolved address.
3440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20  .**.** The VDBE 
3450: 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20  knows that a P2 
3460: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
3470: 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20   because labels 
3480: 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65  are.** always ne
3490: 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61  gative and P2 va
34a0: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
34b0: 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74   to be non-negat
34c0: 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  ive..** Hence, a
34d0: 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c   negative P2 val
34e0: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68  ue is a label th
34f0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
3500: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 20 28 4c   resolved..** (L
3510: 61 74 65 72 3a 29 20 54 68 69 73 20 69 73 20 6f  ater:) This is o
3520: 6e 6c 79 20 74 72 75 65 20 66 6f 72 20 6f 70 63  nly true for opc
3530: 6f 64 65 73 20 74 68 61 74 20 68 61 76 65 20 74  odes that have t
3540: 68 65 20 4f 50 46 4c 47 5f 4a 55 4d 50 0a 2a 2a  he OPFLG_JUMP.**
3550: 20 70 72 6f 70 65 72 74 79 2e 0a 2a 2a 0a 2a 2a   property..**.**
3560: 20 56 61 72 69 61 62 6c 65 20 75 73 61 67 65 20   Variable usage 
3570: 6e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  notes:.**.**    
3580: 20 50 61 72 73 65 2e 61 4c 61 62 65 6c 5b 78 5d   Parse.aLabel[x]
3590: 20 20 20 20 20 53 74 6f 72 65 73 20 74 68 65 20       Stores the 
35a0: 61 64 64 72 65 73 73 20 74 68 61 74 20 74 68 65  address that the
35b0: 20 78 2d 74 68 20 6c 61 62 65 6c 20 72 65 73 6f   x-th label reso
35c0: 6c 76 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  lves.**         
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 69 6e 74 6f 2e 20 20 46 6f 72 20 74 65 73 74 69  into.  For testi
35f0: 6e 67 20 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ng (SQLITE_DEBUG
3600: 29 2c 20 75 6e 72 65 73 6f 6c 76 65 64 0a 2a 2a  ), unresolved.**
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 73 20           labels 
3630: 73 74 6f 72 65 73 20 2d 31 2c 20 62 75 74 20 74  stores -1, but t
3640: 68 61 74 20 69 73 20 6e 6f 74 20 72 65 71 75 69  hat is not requi
3650: 72 65 64 2e 0a 2a 2a 20 20 20 20 20 50 61 72 73  red..**     Pars
3660: 65 2e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 20 20  e.nLabelAlloc   
3670: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
3680: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 50 61 72  allocated to Par
3690: 73 65 2e 61 4c 61 62 65 6c 5b 5d 0a 2a 2a 20 20  se.aLabel[].**  
36a0: 20 20 20 50 61 72 73 65 2e 6e 4c 61 62 65 6c 20     Parse.nLabel 
36b0: 20 20 20 20 20 20 20 54 68 65 20 2a 6e 65 67 61         The *nega
36c0: 74 69 76 65 2a 20 6f 66 20 74 68 65 20 6e 75 6d  tive* of the num
36d0: 62 65 72 20 6f 66 20 6c 61 62 65 6c 73 20 74 68  ber of labels th
36e0: 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20  at have.**      
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 62 65 65 6e 20 69 73 73 75 65 64 2e 20     been issued. 
3710: 20 54 68 65 20 6e 65 67 61 74 69 76 65 20 69 73   The negative is
3720: 20 73 74 6f 72 65 64 20 62 65 63 61 75 73 65 0a   stored because.
3730: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3740: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
3750: 67 69 76 65 73 20 61 20 70 65 72 66 6f 72 6d 61  gives a performa
3760: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
3770: 6f 76 65 72 20 73 74 6f 72 69 6e 67 0a 2a 2a 20  over storing.** 
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 20 20 20 20 74 68 65 20 65 71 75 69          the equi
37a0: 76 61 6c 65 6e 74 20 70 6f 73 69 74 69 76 65 20  valent positive 
37b0: 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  value..*/.int sq
37c0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
37d0: 65 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  el(Parse *pParse
37e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 2d 2d 70 50  ){.  return --pP
37f0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3b 0a 7d 0a  arse->nLabel;.}.
3800: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
3810: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
3820: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3830: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3840: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
3850: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
3860: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
3870: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
3880: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
3890: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
38a0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
38b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
38c0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
38d0: 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c 61 62  resizeResolveLab
38e0: 65 6c 28 50 61 72 73 65 20 2a 70 2c 20 56 64 62  el(Parse *p, Vdb
38f0: 65 20 2a 76 2c 20 69 6e 74 20 6a 29 7b 0a 20 20  e *v, int j){.  
3900: 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 31  int nNewSize = 1
3910: 30 20 2d 20 70 2d 3e 6e 4c 61 62 65 6c 3b 0a 20  0 - p->nLabel;. 
3920: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
3930: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
3940: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
3950: 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
3960: 20 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 53             nNewS
3970: 69 7a 65 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  ize*sizeof(p->aL
3980: 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 69 66 28  abel[0]));.  if(
3990: 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 7b   p->aLabel==0 ){
39a0: 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c  .    p->nLabelAl
39b0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  loc = 0;.  }else
39c0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
39d0: 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20 69 3b  DEBUG.    int i;
39e0: 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 4c  .    for(i=p->nL
39f0: 61 62 65 6c 41 6c 6c 6f 63 3b 20 69 3c 6e 4e 65  abelAlloc; i<nNe
3a00: 77 53 69 7a 65 3b 20 69 2b 2b 29 20 70 2d 3e 61  wSize; i++) p->a
3a10: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 23  Label[i] = -1;.#
3a20: 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 6e 4c 61  endif.    p->nLa
3a30: 62 65 6c 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 53  belAlloc = nNewS
3a40: 69 7a 65 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  ize;.    p->aLab
3a50: 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a  el[j] = v->nOp;.
3a60: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
3a70: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
3a80: 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  el(Vdbe *v, int 
3a90: 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  x){.  Parse *p =
3aa0: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
3ab0: 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a 20  t j = ADDR(x);. 
3ac0: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
3ad0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3ae0: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
3af0: 6a 3c 2d 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  j<-p->nLabel );.
3b00: 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 29    assert( j>=0 )
3b10: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
3b20: 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64  DEBUG.  if( p->d
3b30: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
3b40: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
3b50: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
3b60: 52 45 53 4f 4c 56 45 20 4c 41 42 45 4c 20 25 64  RESOLVE LABEL %d
3b70: 20 74 6f 20 25 64 5c 6e 22 2c 20 78 2c 20 76 2d   to %d\n", x, v-
3b80: 3e 6e 4f 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >nOp);.  }.#endi
3b90: 66 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 61 62 65  f.  if( p->nLabe
3ba0: 6c 41 6c 6c 6f 63 20 2b 20 70 2d 3e 6e 4c 61 62  lAlloc + p->nLab
3bb0: 65 6c 20 3c 20 30 20 29 7b 0a 20 20 20 20 72 65  el < 0 ){.    re
3bc0: 73 69 7a 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  sizeResolveLabel
3bd0: 28 70 2c 76 2c 6a 29 3b 0a 20 20 7d 65 6c 73 65  (p,v,j);.  }else
3be0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
3bf0: 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29  >aLabel[j]==(-1)
3c00: 20 29 3b 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61   ); /* Labels ma
3c10: 79 20 6f 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76  y only be resolv
3c20: 65 64 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70  ed once */.    p
3c30: 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d  ->aLabel[j] = v-
3c40: 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  >nOp;.  }.}../*.
3c50: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
3c60: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
3c70: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65   only be run one
3c80: 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
3c90: 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c  qlite3VdbeRunOnl
3ca0: 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a  yOnce(Vdbe *p){.
3cb0: 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65    p->runOnlyOnce
3cc0: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
3cd0: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20  ark the VDBE as 
3ce0: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  one that can onl
3cf0: 79 20 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c  y be run multipl
3d00: 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e times..*/.void
3d10: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
3d20: 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  able(Vdbe *p){. 
3d30: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
3d40: 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 0;.}..#ifdef S
3d50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
3d60: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
3d70: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
3d80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
3d90: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
3da0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
3db0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
3dc0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
3dd0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
3de0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
3df0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
3e00: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
3e10: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
3e20: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
3e30: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
3e40: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
3e50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
3e60: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
3e70: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
3e80: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
3e90: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
3ea0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
3eb0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
3ee0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
3ef0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
3f00: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
3f10: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
3f20: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
3f30: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
3f40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
3f50: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
3f60: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
3f70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
3f80: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
3f90: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
3fa0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
3fb0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
3fc0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
3fd0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3fe0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
3ff0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
4000: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
4010: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
4020: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
4030: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
4040: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4050: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4060: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
4070: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
4080: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
4090: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
40a0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
40b0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40d0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
40e0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
40f0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
4100: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
4110: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
4120: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
4130: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
4140: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
4150: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
4160: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
4170: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
4180: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
4190: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
41a0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
41b0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
41c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
41d0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
41e0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
41f0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
4200: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
4210: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
4220: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
4230: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
4240: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
4250: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
4260: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
4270: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
4280: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
4290: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
42a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
42b0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
42c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
42d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
42e0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
42f0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
4300: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
4310: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4320: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
4330: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
4340: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
4350: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
4360: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4370: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
4380: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
4390: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
43a0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
43b0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
43c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
43d0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
43e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
43f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
4400: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
4410: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
4420: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
4430: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
4440: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4450: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
4460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
4470: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
4480: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
4490: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
44a0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
44b0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
44c0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
44d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
44e0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
44f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
4500: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
4510: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
4520: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
4530: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
4540: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
4550: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
4560: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4570: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
4580: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
4590: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
45a0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
45b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
45c0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
45d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
45e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
45f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
4600: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
4610: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
4620: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
4630: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
4640: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
4650: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
4660: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
4670: 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42     *  OP_CreateB
4680: 74 72 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45  tree/BTREE_INTKE
4690: 59 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72  Y and OP_InitCor
46a0: 6f 75 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20  outine .**      
46b0: 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c  (for CREATE TABL
46c0: 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29  E AS SELECT ...)
46d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
46e0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
46f0: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
4700: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
4710: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
4720: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
4730: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
4740: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
4750: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
4760: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
4770: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
4780: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
4790: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
47a0: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
47b0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
47c0: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
47d0: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
47e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
47f0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
4800: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
4810: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
4820: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
4830: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
4840: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
4850: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
4860: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
4870: 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e  .  int hasFkCoun
4880: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ter = 0;.  int h
4890: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
48a0: 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74  0;.  int hasInit
48b0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
48c0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
48d0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
48e0: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
48f0: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
4900: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
4910: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
4920: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
4930: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
4940: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
4950: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
4960: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
4970: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
4980: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
4990: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
49a0: 20 0a 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65   .     || opcode
49b0: 3d 3d 4f 50 5f 56 44 65 73 74 72 6f 79 0a 20 20  ==OP_VDestroy.  
49c0: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
49d0: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
49e0: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
49f0: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
4a00: 70 2d 3e 70 31 29 21 3d 53 51 4c 49 54 45 5f 4f  p->p1)!=SQLITE_O
4a10: 4b 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  K && pOp->p2==OE
4a20: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
4a30: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
4a40: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
4a50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
4a60: 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65  pcode==OP_Create
4a70: 42 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33  Btree && pOp->p3
4a80: 3d 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29  ==BTREE_INTKEY )
4a90: 20 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20   hasCreateTable 
4aa0: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  = 1;.    if( opc
4ab0: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f  ode==OP_InitCoro
4ac0: 75 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43  utine ) hasInitC
4ad0: 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69  oroutine = 1;.#i
4ae0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4af0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
4b00: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
4b10: 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f  _FkCounter && pO
4b20: 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d  p->p1==0 && pOp-
4b30: 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  >p2==1 ){.      
4b40: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31  hasFkCounter = 1
4b50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4b60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
4b70: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
4b80: 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65  apSub);..  /* Re
4b90: 74 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73  turn true if has
4ba0: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e  Abort==mayAbort.
4bb0: 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20   Or if a malloc 
4bc0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
4bd0: 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63  ..  ** If malloc
4be0: 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68   failed, then th
4bf0: 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61  e while() loop a
4c00: 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  bove may not hav
4c10: 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20  e iterated.  ** 
4c20: 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f  through all opco
4c30: 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74  des and hasAbort
4c40: 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f   may be set inco
4c50: 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a  rrectly. Return.
4c60: 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68    ** true for th
4c70: 69 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65  is case to preve
4c80: 6e 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20  nt the assert() 
4c90: 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66  in the callers f
4ca0: 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66  rame.  ** from f
4cb0: 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65  ailing.  */.  re
4cc0: 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61  turn ( v->db->ma
4cd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61  llocFailed || ha
4ce0: 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74  sAbort==mayAbort
4cf0: 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72   || hasFkCounter
4d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
4d10: 7c 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c  | (hasCreateTabl
4d20: 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f  e && hasInitCoro
4d30: 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64  utine) );.}.#end
4d40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
4d50: 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33  UG - the sqlite3
4d60: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
4d70: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69   function */..#i
4d80: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4d90: 47 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  G./*.** Incremen
4da0: 74 20 74 68 65 20 6e 57 72 69 74 65 20 63 6f 75  t the nWrite cou
4db0: 6e 74 65 72 20 69 6e 20 74 68 65 20 56 44 42 45  nter in the VDBE
4dc0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
4dd0: 73 20 6e 6f 74 20 61 6e 0a 2a 2a 20 65 70 68 65  s not an.** ephe
4de0: 6d 65 72 61 6c 20 63 75 72 73 6f 72 2c 20 6f 72  meral cursor, or
4df0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
4e00: 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e  rgument is NULL.
4e10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4e20: 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75  VdbeIncrWriteCou
4e30: 6e 74 65 72 28 56 64 62 65 20 2a 70 2c 20 56 64  nter(Vdbe *p, Vd
4e40: 62 65 43 75 72 73 6f 72 20 2a 70 43 29 7b 0a 20  beCursor *pC){. 
4e50: 20 69 66 28 20 70 43 3d 3d 30 0a 20 20 20 7c 7c   if( pC==0.   ||
4e60: 20 28 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d   (pC->eCurType!=
4e70: 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 0a 20  CURTYPE_SORTER. 
4e80: 20 20 20 20 20 20 26 26 20 70 43 2d 3e 65 43 75        && pC->eCu
4e90: 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50  rType!=CURTYPE_P
4ea0: 53 45 55 44 4f 0a 20 20 20 20 20 20 20 26 26 20  SEUDO.       && 
4eb0: 21 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c  !pC->isEphemeral
4ec0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 57  ).  ){.    p->nW
4ed0: 72 69 74 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 23 65  rite++;.  }.}.#e
4ee0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
4ef0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
4f00: 41 73 73 65 72 74 20 69 66 20 61 6e 20 41 62 6f  Assert if an Abo
4f10: 72 74 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rt at this point
4f20: 20 69 6e 20 74 69 6d 65 20 6d 69 67 68 74 20 72   in time might r
4f30: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75  esult in a corru
4f40: 70 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  pt.** database..
4f50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4f60: 64 62 65 41 73 73 65 72 74 41 62 6f 72 74 61 62  dbeAssertAbortab
4f70: 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  le(Vdbe *p){.  a
4f80: 73 73 65 72 74 28 20 70 2d 3e 6e 57 72 69 74 65  ssert( p->nWrite
4f90: 3d 3d 30 20 7c 7c 20 70 2d 3e 75 73 65 73 53 74  ==0 || p->usesSt
4fa0: 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 7d 0a 23  mtJournal );.}.#
4fb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
4fc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4fd0: 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70  led after all op
4fe0: 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20  codes have been 
4ff0: 69 6e 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f  inserted.  It lo
5000: 6f 70 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61  ops.** through a
5010: 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61  ll the opcodes a
5020: 6e 64 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65  nd fixes up some
5030: 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
5040: 28 31 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d  (1) For each jum
5050: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  p instruction wi
5060: 74 68 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  th a negative P2
5070: 20 76 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29   value (a label)
5080: 0a 2a 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20  .**     resolve 
5090: 74 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20  the P2 value to 
50a0: 61 6e 20 61 63 74 75 61 6c 20 61 64 64 72 65 73  an actual addres
50b0: 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d  s..**.** (2) Com
50c0: 70 75 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  pute the maximum
50d0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
50e0: 65 6e 74 73 20 75 73 65 64 20 62 79 20 61 6e 79  ents used by any
50f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
5100: 20 20 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74       and store t
5110: 68 61 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d  hat value in *pM
5120: 61 78 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a  axFuncArgs..**.*
5130: 2a 20 28 33 29 20 55 70 64 61 74 65 20 74 68 65  * (3) Update the
5140: 20 56 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61   Vdbe.readOnly a
5150: 6e 64 20 56 64 62 65 2e 62 49 73 52 65 61 64 65  nd Vdbe.bIsReade
5160: 72 20 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72  r flags to accur
5170: 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64  ately.**     ind
5180: 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20 70  icate what the p
5190: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
51a0: 74 20 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e  t actually does.
51b0: 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69  .**.** (4) Initi
51c0: 61 6c 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64  alize the p4.xAd
51d0: 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e  vance pointer on
51e0: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 75 73   opcodes that us
51f0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20  e it..**.** (5) 
5200: 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f  Reclaim the memo
5210: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ry allocated for
5220: 20 73 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e   storing labels.
5230: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5240: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75  ine will only fu
5250: 6e 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79  nction correctly
5260: 20 69 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65   if the mkopcode
5270: 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a  h.tcl generator.
5280: 2a 2a 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72  ** script number
5290: 73 20 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f  s the opcodes co
52a0: 72 72 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65  rrectly.  Change
52b0: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
52c0: 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f  e must be.** coo
52d0: 72 64 69 6e 61 74 65 64 20 77 69 74 68 20 63 68  rdinated with ch
52e0: 61 6e 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64  anges to mkopcod
52f0: 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69  eh.tcl..*/.stati
5300: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
5310: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
5320: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
5330: 73 29 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72  s){.  int nMaxAr
5340: 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72  gs = *pMaxFuncAr
5350: 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  gs;.  Op *pOp;. 
5360: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
5370: 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   p->pParse;.  in
5380: 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72  t *aLabel = pPar
5390: 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d  se->aLabel;.  p-
53a0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
53b0: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
53c0: 30 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  0;.  pOp = &p->a
53d0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20  Op[p->nOp-1];.  
53e0: 77 68 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f  while(1){..    /
53f0: 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f  * Only JUMP opco
5400: 64 65 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72  des and the shor
5410: 74 20 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61  t list of specia
5420: 6c 20 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65  l opcodes in the
5430: 20 73 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62   switch.    ** b
5440: 65 6c 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20  elow need to be 
5450: 63 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65  considered.  The
5460: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67   mkopcodeh.tcl g
5470: 65 6e 65 72 61 74 6f 72 20 73 63 72 69 70 74 20  enerator script 
5480: 67 72 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c  groups.    ** al
5490: 6c 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  l these opcodes 
54a0: 74 6f 67 65 74 68 65 72 20 6e 65 61 72 20 74 68  together near th
54b0: 65 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f  e front of the o
54c0: 70 63 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69  pcode list.  Ski
54d0: 70 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63  p.    ** any opc
54e0: 6f 64 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ode that does no
54f0: 74 20 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e  t need processin
5500: 67 20 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20  g by virtual of 
5510: 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
5520: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
5530: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58  r than SQLITE_MX
5540: 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73  _JUMP_OPCODE, as
5550: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
5560: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20  ptimization..   
5570: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   */.    if( pOp-
5580: 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f  >opcode<=SQLITE_
5590: 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29  MX_JUMP_OPCODE )
55a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a  {.      /* NOTE:
55b0: 20 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61   Be sure to upda
55c0: 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  te mkopcodeh.tcl
55d0: 20 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20   when adding or 
55e0: 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a  removing.      *
55f0: 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69  * cases from thi
5600: 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20  s switch! */.   
5610: 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e     switch( pOp->
5620: 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  opcode ){.      
5630: 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61    case OP_Transa
5640: 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20  ction: {.       
5650: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d     if( pOp->p2!=
5660: 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  0 ) p->readOnly 
5670: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  = 0;.          /
5680: 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * fall thru */. 
5690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
56a0: 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d   case OP_AutoCom
56b0: 6d 69 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73  mit:.        cas
56c0: 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20  e OP_Savepoint: 
56d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
56e0: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
56f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5700: 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66         }.#ifndef
5710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5720: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5730: 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e  _Checkpoint:.#en
5740: 64 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65  dif.        case
5750: 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20   OP_Vacuum:.    
5760: 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72      case OP_Jour
5770: 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20  nalMode: {.     
5780: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
5790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
57a0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
57b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
57c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
57d0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
57e0: 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  t:.        case 
57f0: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b  OP_SorterNext: {
5800: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
5810: 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71  p4.xAdvance = sq
5820: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a  lite3BtreeNext;.
5830: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
5840: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
5850: 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  CE;.          /*
5860: 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
5870: 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20  tor never codes 
5880: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63  any of these opc
5890: 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20  odes as a jump. 
58a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61           ** to a
58b0: 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72   label.  They ar
58c0: 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61  e always coded a
58d0: 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72  s a jump backwar
58e0: 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20  ds to a .       
58f0: 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72     ** known addr
5900: 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ess */.         
5910: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
5920: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  >=0 );.         
5930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5940: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
5950: 50 5f 50 72 65 76 3a 20 7b 0a 20 20 20 20 20 20  P_Prev: {.      
5960: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
5970: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
5980: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
5990: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
59a0: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
59b0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
59c0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
59d0: 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79   never codes any
59e0: 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65   of these opcode
59f0: 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20  s as a jump.    
5a00: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61        ** to a la
5a10: 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61  bel.  They are a
5a20: 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73 20 61  lways coded as a
5a30: 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20   jump backwards 
5a40: 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20 20 20  to a .          
5a50: 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73  ** known address
5a60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
5a70: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30  sert( pOp->p2>=0
5a80: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
5a90: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
5aa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5ab0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
5ac0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
5ad0: 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20  VUpdate: {.     
5ae0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
5af0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
5b00: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  Args = pOp->p2;.
5b10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5b20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b30: 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74     case OP_VFilt
5b40: 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  er: {.          
5b50: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
5b60: 20 61 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20   assert( (pOp - 
5b70: 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a  p->aOp) >= 3 );.
5b80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5b90: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
5ba0: 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a  ==OP_Integer );.
5bb0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f            n = pO
5bc0: 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-1].p1;.      
5bd0: 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72      if( n>nMaxAr
5be0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
5bf0: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;.          /* 
5c00: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
5c10: 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  o the default ca
5c20: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  se */.        }.
5c30: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64  #endif.        d
5c40: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5c50: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c      if( pOp->p2<
5c60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
5c70: 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65   /* The mkopcode
5c80: 68 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73  h.tcl script has
5c90: 20 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69   so arranged thi
5ca0: 6e 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c  ngs that the onl
5cb0: 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  y.            **
5cc0: 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65   non-jump opcode
5cd0: 73 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49  s less than SQLI
5ce0: 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20  TE_MX_JUMP_CODE 
5cf0: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
5d00: 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
5d10: 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69   have non-negati
5d20: 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32  ve values for P2
5d30: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
5d40: 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65   assert( (sqlite
5d50: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
5d60: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  pOp->opcode] & O
5d70: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b  PFLG_JUMP)!=0 );
5d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
5d90: 65 72 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70  ert( ADDR(pOp->p
5da0: 32 29 3c 2d 70 50 61 72 73 65 2d 3e 6e 4c 61 62  2)<-pParse->nLab
5db0: 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  el );.          
5dc0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
5dd0: 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29  el[ADDR(pOp->p2)
5de0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
5df0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5e00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5e10: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  }.      /* The m
5e20: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72  kopcodeh.tcl scr
5e30: 69 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e  ipt has so arran
5e40: 67 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20  ged things that 
5e50: 74 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  the only.      *
5e60: 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64  * non-jump opcod
5e70: 65 73 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c  es less than SQL
5e80: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45  ITE_MX_JUMP_CODE
5e90: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
5ea0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65  to.      ** have
5eb0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61   non-negative va
5ec0: 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a  lues for P2. */.
5ed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 73        assert( (s
5ee0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
5ef0: 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  erty[pOp->opcode
5f00: 5d 26 4f 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30  ]&OPFLG_JUMP)==0
5f10: 20 7c 7c 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b   || pOp->p2>=0);
5f20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5f30: 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65  Op==p->aOp ) bre
5f40: 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20  ak;.    pOp--;. 
5f50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
5f60: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65  ee(p->db, pParse
5f70: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61  ->aLabel);.  pPa
5f80: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b  rse->aLabel = 0;
5f90: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  .  pParse->nLabe
5fa0: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75  l = 0;.  *pMaxFu
5fb0: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
5fc0: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  s;.  assert( p->
5fd0: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20  bIsReader!=0 || 
5fe0: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
5ff0: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d  >btreeMask) );.}
6000: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6010: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
6020: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
6030: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
6040: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
6050: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6060: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
6070: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6080: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6090: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
60a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69  p;.}../*.** Veri
60b0: 66 79 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  fy that at least
60c0: 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20   N opcode slots 
60d0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  are available in
60e0: 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61   p without.** ha
60f0: 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66  ving to malloc f
6100: 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65  or more space (e
6110: 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69  xcept when compi
6120: 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c  led using.** SQL
6130: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
6140: 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69 73 20  _STRESS).  This 
6150: 69 6e 74 65 72 66 61 63 65 20 69 73 20 75 73 65  interface is use
6160: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
6170: 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68  .** to verify th
6180: 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73  at certain calls
6190: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41   to sqlite3VdbeA
61a0: 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e  ddOpList() can n
61b0: 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65  ever.** fail due
61c0: 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20   to a OOM fault 
61d0: 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20 74  and hence that t
61e0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
61f0: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
6200: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77  dbeAddOpList() w
6210: 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f  ill always be no
6220: 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64  n-NULL..*/.#if d
6230: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6240: 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
6250: 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41  (SQLITE_TEST_REA
6260: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69  LLOC_STRESS).voi
6270: 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72  d sqlite3VdbeVer
6280: 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69  ifyNoMallocRequi
6290: 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  red(Vdbe *p, int
62a0: 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70   N){.  assert( p
62b0: 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e  ->nOp + N <= p->
62c0: 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65  nOpAlloc );.}.#e
62d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69  ndif../*.** Veri
62e0: 66 79 20 74 68 61 74 20 74 68 65 20 56 4d 20 70  fy that the VM p
62f0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
6300: 79 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20  y argument does 
6310: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  not contain.** a
6320: 6e 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  n OP_ResultRow o
6330: 70 63 6f 64 65 2e 20 46 61 69 6c 20 61 6e 20 61  pcode. Fail an a
6340: 73 73 65 72 74 28 29 20 69 66 20 69 74 20 64 6f  ssert() if it do
6350: 65 73 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  es. This is used
6360: 0a 2a 2a 20 62 79 20 63 6f 64 65 20 69 6e 20 70  .** by code in p
6370: 72 61 67 6d 61 2e 63 20 74 6f 20 65 6e 73 75 72  ragma.c to ensur
6380: 65 20 74 68 61 74 20 74 68 65 20 69 6d 70 6c 65  e that the imple
6390: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 63 65 72  mentation of cer
63a0: 74 61 69 6e 0a 2a 2a 20 70 72 61 67 6d 61 73 20  tain.** pragmas 
63b0: 63 6f 6d 70 6f 72 74 73 20 77 69 74 68 20 74 68  comports with th
63c0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
63d0: 64 20 69 6e 20 74 68 65 20 6d 6b 70 72 61 67 6d  d in the mkpragm
63e0: 61 74 61 62 2e 74 63 6c 0a 2a 2a 20 73 63 72 69  atab.tcl.** scri
63f0: 70 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  pt..*/.#if defin
6400: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
6410: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6420: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
6430: 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71  _STRESS).void sq
6440: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
6450: 6f 52 65 73 75 6c 74 52 6f 77 28 56 64 62 65 20  oResultRow(Vdbe 
6460: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
6470: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
6480: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  p; i++){.    ass
6490: 65 72 74 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  ert( p->aOp[i].o
64a0: 70 63 6f 64 65 21 3d 4f 50 5f 52 65 73 75 6c 74  pcode!=OP_Result
64b0: 52 6f 77 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Row );.  }.}.#en
64c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
64d0: 61 74 65 20 63 6f 64 65 20 28 61 20 73 69 6e 67  ate code (a sing
64e0: 6c 65 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 20  le OP_Abortable 
64f0: 6f 70 63 6f 64 65 29 20 74 68 61 74 20 77 69 6c  opcode) that wil
6500: 6c 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 61 74  l.** verify that
6510: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
6520: 6d 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  m can safely cal
6530: 6c 20 41 62 6f 72 74 20 69 6e 20 74 68 65 20 63  l Abort in the c
6540: 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 78  urrent.** contex
6550: 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  t..*/.#if define
6560: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
6570: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6580: 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28  VerifyAbortable(
6590: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 6e 45  Vdbe *p, int onE
65a0: 72 72 6f 72 29 7b 0a 20 20 69 66 28 20 6f 6e 45  rror){.  if( onE
65b0: 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
65c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
65d0: 70 30 28 70 2c 20 4f 50 5f 41 62 6f 72 74 61 62  p0(p, OP_Abortab
65e0: 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  le);.}.#endif../
65f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6600: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
6610: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
6620: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
6630: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
6640: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
6650: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
6660: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
6670: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
6680: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
6690: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
66a0: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
66b0: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
66c0: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
66d0: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
66e0: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
66f0: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
6700: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
6710: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6720: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
6730: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
6740: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
6750: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
6760: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
6770: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
6780: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
6790: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
67a0: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
67b0: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
67c0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
67d0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
67e0: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
67f0: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
6800: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
6810: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
6820: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
6830: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
6840: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
6850: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
6860: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
6870: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
6880: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
6890: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
68a0: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
68b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  /.  assert( DbMa
68c0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
68d0: 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65  eeMask) );..  re
68e0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
68f0: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
6900: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
6910: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
6920: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
6930: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
6940: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
6950: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
6960: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
6970: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
6980: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
6990: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
69a0: 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50  **.** Non-zero P
69b0: 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a  2 arguments to j
69c0: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
69d0: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
69e0: 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73  ly adjusted.** s
69f0: 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  o that the jump 
6a00: 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69  target is relati
6a10: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
6a20: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
6a30: 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ed..*/.VdbeOp *s
6a40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
6a50: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ist(.  Vdbe *p, 
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64      /* Add opcod
6a80: 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  es to the prepar
6a90: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
6aa0: 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20    int nOp,      
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6ac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f  * Number of opco
6ad0: 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  des to add */.  
6ae0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
6af0: 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20   *aOp,       /* 
6b00: 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  The opcodes to b
6b10: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
6b20: 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20   iLineno        
6b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
6b40: 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75  rce-file line nu
6b50: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70  mber of first op
6b60: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
6b70: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
6b80: 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61  ut, *pFirst;.  a
6b90: 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a  ssert( nOp>0 );.
6ba0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
6bb0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
6bc0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
6bd0: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e  nOp + nOp > p->n
6be0: 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f  OpAlloc && growO
6bf0: 70 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29  pArray(p, nOp) )
6c00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6c10: 20 20 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70    }.  pFirst = p
6c20: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  Out = &p->aOp[p-
6c30: 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  >nOp];.  for(i=0
6c40: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f  ; i<nOp; i++, aO
6c50: 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20  p++, pOut++){.  
6c60: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
6c70: 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   aOp->opcode;.  
6c80: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70    pOut->p1 = aOp
6c90: 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  ->p1;.    pOut->
6ca0: 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = aOp->p2;.  
6cb0: 20 20 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70    assert( aOp->p
6cc0: 32 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  2>=0 );.    if( 
6cd0: 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72  (sqlite3OpcodePr
6ce0: 6f 70 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f  operty[aOp->opco
6cf0: 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  de] & OPFLG_JUMP
6d00: 29 21 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e  )!=0 && aOp->p2>
6d10: 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d  0 ){.      pOut-
6d20: 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  >p2 += p->nOp;. 
6d30: 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70     }.    pOut->p
6d40: 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20  3 = aOp->p3;.   
6d50: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
6d60: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
6d70: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
6d80: 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30      pOut->p5 = 0
6d90: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6da0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6db0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74  OMMENTS.    pOut
6dc0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
6dd0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
6de0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
6df0: 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72  GE.    pOut->iSr
6e00: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b  cLine = iLineno+
6e10: 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f  i;.#else.    (vo
6e20: 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64  id)iLineno;.#end
6e30: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
6e40: 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70  _DEBUG.    if( p
6e50: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
6e60: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
6e70: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ace ){.      sql
6e80: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
6e90: 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d  0, i+p->nOp, &p-
6ea0: 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b  >aOp[i+p->nOp]);
6eb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
6ec0: 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f  }.  p->nOp += nO
6ed0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72  p;.  return pFir
6ee0: 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  st;.}..#if defin
6ef0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
6f00: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
6f10: 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  )./*.** Add an e
6f20: 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61  ntry to the arra
6f30: 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61  y of counters ma
6f40: 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33  naged by sqlite3
6f50: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
6f60: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
6f70: 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75  te3VdbeScanStatu
6f80: 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  s(.  Vdbe *p,   
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64       /* VM to ad
6fb0: 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74  d scanstatus() t
6fc0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  o */.  int addrE
6fd0: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20  xplain,         
6fe0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
6ff0: 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20  s of OP_Explain 
7000: 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20  (or 0) */.  int 
7010: 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20  addrLoop,       
7020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7030: 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63  ddress of loop c
7040: 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74  ounter */ .  int
7050: 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20   addrVisit,     
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7070: 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20  Address of rows 
7080: 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20  visited counter 
7090: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74  */.  LogEst nEst
70a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
70b0: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
70c0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  d number of outp
70d0: 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e  ut rows */.  con
70e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7100: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
7110: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61   index being sca
7120: 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nned */.){.  int
7130: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63   nByte = (p->nSc
7140: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53  an+1) * sizeof(S
7150: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63  canStatus);.  Sc
7160: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a  anStatus *aNew;.
7170: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74    aNew = (ScanSt
7180: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52  atus*)sqlite3DbR
7190: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
71a0: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a  >aScan, nByte);.
71b0: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
71c0: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e    ScanStatus *pN
71d0: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53  ew = &aNew[p->nS
71e0: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77  can++];.    pNew
71f0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
7200: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
7210: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20   pNew->addrLoop 
7220: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20  = addrLoop;.    
7230: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20  pNew->addrVisit 
7240: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20  = addrVisit;.   
7250: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45   pNew->nEst = nE
7260: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  st;.    pNew->zN
7270: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7280: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61  trDup(p->db, zNa
7290: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61  me);.    p->aSca
72a0: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  n = aNew;.  }.}.
72b0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
72c0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
72d0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f  of the opcode, o
72e0: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72  r P1, P2, P3, or
72f0: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20   P5 operands.** 
7300: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
7310: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
7320: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
7330: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65  hangeOpcode(Vdbe
7340: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75   *p, u32 addr, u
7350: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20  8 iNewOpcode){. 
7360: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
7370: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64  p(p,addr)->opcod
7380: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a  e = iNewOpcode;.
7390: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
73a0: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
73b0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
73c0: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
73d0: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
73e0: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p1 = val;.}.
73f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7400: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
7410: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
7420: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
7430: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
7440: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p2 = val;.}.vo
7450: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7460: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
7470: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
7480: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
7490: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
74a0: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p3 = val;.}.void
74b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
74c0: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31  geP5(Vdbe *p, u1
74d0: 36 20 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28  6 p5){.  assert(
74e0: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
74f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7500: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
7510: 3e 30 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >0 ) p->aOp[p->n
7520: 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d  Op-1].p5 = p5;.}
7530: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
7540: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
7550: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
7560: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
7570: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
7580: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
7590: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
75a0: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
75b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
75c0: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
75d0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c  int addr){.  sql
75e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
75f0: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
7600: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
7610: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
7620: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
7630: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
7640: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
7650: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
7660: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
7670: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
7680: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
7690: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
76a0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  n(sqlite3 *db, F
76b0: 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20  uncDef *pDef){. 
76c0: 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
76d0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
76e0: 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b  UNC_EPHEM)!=0 ){
76f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7700: 65 65 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a  eeNN(db, pDef);.
7710: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
7720: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
7730: 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70  ay(sqlite3 *, Op
7740: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a   *, int);../*.**
7750: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c   Delete a P4 val
7760: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ue if necessary.
7770: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
7780: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
7790: 66 72 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65  freeP4Mem(sqlite
77a0: 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a  3 *db, Mem *p){.
77b0: 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f    if( p->szMallo
77c0: 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  c ) sqlite3DbFre
77d0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
77e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
77f0: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73  eeNN(db, p);.}.s
7800: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
7810: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
7820: 34 46 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33  4FuncCtx(sqlite3
7830: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f   *db, sqlite3_co
7840: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65  ntext *p){.  fre
7850: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
7860: 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29  on(db, p->pFunc)
7870: 3b 0a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ;. sqlite3DbFree
7880: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
7890: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
78a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
78b0: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
78c0: 34 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62  4){.  assert( db
78d0: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34   );.  switch( p4
78e0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
78f0: 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20   P4_FUNCCTX: {. 
7900: 20 20 20 20 20 66 72 65 65 50 34 46 75 6e 63 43       freeP4FuncC
7910: 74 78 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f  tx(db, (sqlite3_
7920: 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20  context*)p4);.  
7930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7940: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41  .    case P4_REA
7950: 4c 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  L:.    case P4_I
7960: 4e 54 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50  NT64:.    case P
7970: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63  4_DYNAMIC:.    c
7980: 61 73 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a  ase P4_DYNBLOB:.
7990: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
79a0: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
79b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
79c0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
79d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
79e0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
79f0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
7a00: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
7a10: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
7a20: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
7a30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7a40: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
7a50: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
7a60: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
7a70: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
7a80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7a90: 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34  te(db, (Expr*)p4
7aa0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7ab0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
7ac0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
7ad0: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70  : {.      freeEp
7ae0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
7af0: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
7b00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7b10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7b20: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69  4_MEM: {.      i
7b30: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
7b40: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
7b50: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7b60: 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee((sqlite3_valu
7b70: 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65  e*)p4);.      }e
7b80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65  lse{.        fre
7b90: 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a  eP4Mem(db, (Mem*
7ba0: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )p4);.      }.  
7bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7bc0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
7bd0: 42 20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  B : {.      if( 
7be0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
7bf0: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61  ==0 ) sqlite3Vta
7c00: 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20  bUnlock((VTable 
7c10: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7c20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
7c30: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
7c40: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
7c50: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
7c60: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
7c70: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
7c80: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
7c90: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
7ca0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
7cb0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
7cc0: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
7cd0: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
7ce0: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
7cf0: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
7d00: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
7d10: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
7d20: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
7d30: 20 20 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70      for(pOp=&aOp
7d40: 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f  [nOp-1]; pOp>=aO
7d50: 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20  p; pOp--){.     
7d60: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
7d70: 20 3c 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c   <= P4_FREE_IF_L
7d80: 45 20 29 20 66 72 65 65 50 34 28 64 62 2c 20 70  E ) freeP4(db, p
7d90: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
7da0: 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53  >p4.p);.#ifdef S
7db0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
7dc0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
7dd0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7de0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
7df0: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
7e00: 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69   .    }.    sqli
7e10: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
7e20: 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  aOp);.  }.}../*.
7e30: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
7e40: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
7e50: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
7e60: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
7e70: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
7e80: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
7e90: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
7ea0: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
7eb0: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
7ec0: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
7ed0: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
7ee0: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
7ef0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7f00: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
7f10: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
7f20: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
7f30: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
7f40: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
7f50: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
7f60: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
7f70: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
7f80: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
7f90: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71  P_Noop.*/.int sq
7fa0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
7fb0: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
7fc0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65  nt addr){.  Vdbe
7fd0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70  Op *pOp;.  if( p
7fe0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7ff0: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
8000: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
8010: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20   && addr<p->nOp 
8020: 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  );.  pOp = &p->a
8030: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65  Op[addr];.  free
8040: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
8050: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
8060: 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  );.  pOp->p4type
8070: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
8080: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a   pOp->p4.z = 0;.
8090: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
80a0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72  OP_Noop;.  retur
80b0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
80c0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
80d0: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20   is "op" and it 
80e0: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65  is not a jump de
80f0: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  stination,.** th
8100: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52  en remove it.  R
8110: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
8120: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63  d only if an opc
8130: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  ode was removed.
8140: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
8150: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
8160: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
8170: 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e   op){.  if( p->n
8180: 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70  Op>0 && p->aOp[p
8190: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
81a0: 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =op ){.    retur
81b0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  n sqlite3VdbeCha
81c0: 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e  ngeToNoop(p, p->
81d0: 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  nOp-1);.  }else{
81e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
81f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
8200: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
8210: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
8220: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
8230: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
8240: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
8250: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
8260: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
8270: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
8280: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
8290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
82a0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
82b0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
82c0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
82d0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
82e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
82f0: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
8300: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
8310: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
8320: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
8330: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
8340: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
8350: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
8360: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
8370: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
8380: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
8390: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
83a0: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
83b0: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
83c0: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
83d0: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
83e0: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
83f0: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
8400: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
8410: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
8420: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
8430: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
8440: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
8450: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
8460: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
8470: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
8480: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
8490: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
84a0: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
84b0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
84c0: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
84d0: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
84e0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
84f0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
8500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8510: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
8520: 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c   vdbeChangeP4Ful
8530: 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20  l(.  Vdbe *p,.  
8540: 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74  Op *pOp,.  const
8550: 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e   char *zP4,.  in
8560: 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70  t n.){.  if( pOp
8570: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
8580: 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f  freeP4(p->db, pO
8590: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
85a0: 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  p4.p);.    pOp->
85b0: 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  p4type = 0;.    
85c0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
85d0: 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a   }.  if( n<0 ){.
85e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
85f0: 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29  hangeP4(p, (int)
8600: 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20  (pOp - p->aOp), 
8610: 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  zP4, n);.  }else
8620: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
8630: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
8640: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
8650: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
8660: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
8670: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
8680: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
8690: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
86a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
86b0: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
86c0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
86d0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
86e0: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
86f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8700: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
8710: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
8720: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
8730: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
8740: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
8750: 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d  p->aOp!=0 || db-
8760: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
8770: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
8780: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
8790: 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  f( n!=P4_VTAB ) 
87a0: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
87b0: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
87c0: 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  P4);.    return;
87d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
87e0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
87f0: 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  ert( addr<p->nOp
8800: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
8810: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
8820: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
8830: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
8840: 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30  ddr];.  if( n>=0
8850: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20   || pOp->p4type 
8860: 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67  ){.    vdbeChang
8870: 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20  eP4Full(p, pOp, 
8880: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74  zP4, n);.    ret
8890: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
88a0: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
88b0: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
88c0: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
88d0: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
88e0: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
88f0: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
8900: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
8910: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
8920: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
8930: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
8940: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
8950: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
8960: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
8970: 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20  if( zP4!=0 ){.  
8980: 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b    assert( n<0 );
8990: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
89a0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
89b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
89c0: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
89d0: 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41     if( n==P4_VTA
89e0: 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c  B ) sqlite3VtabL
89f0: 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34  ock((VTable*)zP4
8a00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8a10: 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70  Change the P4 op
8a20: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73  erand of the mos
8a30: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
8a40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a   instruction .**
8a50: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65   to the value de
8a60: 66 69 6e 65 64 20 62 79 20 74 68 65 20 61 72 67  fined by the arg
8a70: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73  uments.  This is
8a80: 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a   a high-speed.**
8a90: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
8aa0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
8ab0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  )..**.** The P4 
8ac0: 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74  operand must not
8ad0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
8ae0: 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20  ously defined.  
8af0: 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50  And the new.** P
8b00: 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34  4 must not be P4
8b10: 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c  _INT32.  Use sql
8b20: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
8b30: 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a  () in either of.
8b40: 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a  ** those cases..
8b50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8b60: 64 62 65 41 70 70 65 6e 64 50 34 28 56 64 62 65  dbeAppendP4(Vdbe
8b70: 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20   *p, void *pP4, 
8b80: 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70  int n){.  VdbeOp
8b90: 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28   *pOp;.  assert(
8ba0: 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20   n!=P4_INT32 && 
8bb0: 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20  n!=P4_VTAB );.  
8bc0: 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a  assert( n<=0 );.
8bd0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
8be0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8bf0: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e   freeP4(p->db, n
8c00: 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b  , pP4);.  }else{
8c10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 34  .    assert( pP4
8c20: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
8c30: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
8c40: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
8c50: 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20  [p->nOp-1];.    
8c60: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
8c70: 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20  ype==P4_NOTUSED 
8c80: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
8c90: 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d  pe = n;.    pOp-
8ca0: 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d  >p4.p = pP4;.  }
8cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
8cc0: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
8cd0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8ce0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
8cf0: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
8d00: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
8d10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8d20: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
8d30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
8d40: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
8d50: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
8d60: 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Vdbe;.  KeyInfo 
8d70: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73  *pKeyInfo;.  ass
8d80: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
8d90: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
8da0: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73  ;.  pKeyInfo = s
8db0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
8dc0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64  ndex(pParse, pId
8dd0: 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  x);.  if( pKeyIn
8de0: 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  fo ) sqlite3Vdbe
8df0: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79  AppendP4(v, pKey
8e00: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
8e10: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
8e20: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
8e30: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a  IN_COMMENTS./*.*
8e40: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
8e50: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  ment on the most
8e60: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
8e70: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
8e80: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
8e90: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
8ea0: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
8eb0: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
8ec0: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
8ed0: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
8ee0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
8ef0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
8f00: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
8f10: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
8f20: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  n build..*/.stat
8f30: 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d  ic void vdbeVCom
8f40: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
8f50: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
8f60: 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a  t, va_list ap){.
8f70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
8f80: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
8f90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8fa0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
8fb0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
8fc0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
8fd0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
8fe0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
8ff0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9000: 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  aOp );.    sqlit
9010: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
9020: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
9030: 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  .zComment);.    
9040: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
9050: 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69  .zComment = sqli
9060: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
9070: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
9080: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
9090: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
90a0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
90b0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
90c0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
90d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
90e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
90f0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
9100: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
9110: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
9120: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
9130: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
9140: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
9150: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
9160: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
9170: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
9180: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
9190: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
91a0: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76   OP_Noop);.    v
91b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
91c0: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
91d0: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
91e0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
91f0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
9200: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
9210: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
9220: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
9230: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
9240: 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c  lue if the iSrcL
9250: 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68  ine field for th
9260: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64  e previously cod
9270: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
9280: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9290: 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72  dbeSetLineNumber
92a0: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c  (Vdbe *v, int iL
92b0: 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ine){.  sqlite3V
92c0: 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e  dbeGetOp(v,-1)->
92d0: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
92e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
92f0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
9300: 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  GE */../*.** Ret
9310: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
9320: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
9330: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
9340: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
9350: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
9360: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
9370: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
9380: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
9390: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
93a0: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
93b0: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
93c0: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
93d0: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
93e0: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
93f0: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
9400: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
9410: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
9420: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
9430: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
9440: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
9450: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
9460: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
9470: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
9480: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
9490: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
94a0: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
94b0: 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68  n OOM fault with
94c0: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68  out having to ch
94d0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
94e0: 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a  e return from .*
94f0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
9500: 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  s a valid pointe
9510: 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  r.  But because 
9520: 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65  the dummy.opcode
9530: 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20   is 0,.** dummy 
9540: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72  will never be wr
9550: 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20  itten to.  This 
9560: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63  is verified by c
9570: 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61  ode inspection a
9580: 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67  nd.** by running
9590: 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a   with Valgrind..
95a0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
95b0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
95c0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
95d0: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
95e0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
95f0: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
9600: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
9610: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
9620: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
9630: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
9640: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
9650: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
9660: 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f  /.  static VdbeO
9670: 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e  p dummy;  /* Ign
9680: 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72  ore the MSVC war
9690: 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e  ning about no in
96a0: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61  itializer */.  a
96b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
96c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
96d0: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
96e0: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
96f0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
9700: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
9710: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
9720: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
9730: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
9740: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
9750: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
9760: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
9770: 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mmy;.  }else{.  
9780: 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70    return &p->aOp
9790: 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23  [addr];.  }.}..#
97a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
97b0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
97c0: 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a  _COMMENTS)./*.**
97d0: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
97e0: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65  er value for one
97f0: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
9800: 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65  rs to the opcode
9810: 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   pOp.** determin
9820: 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20  ed by character 
9830: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
9840: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72   translateP(char
9850: 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f   c, const Op *pO
9860: 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27  p){.  if( c=='1'
9870: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
9880: 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20  1;.  if( c=='2' 
9890: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32  ) return pOp->p2
98a0: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29  ;.  if( c=='3' )
98b0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b   return pOp->p3;
98c0: 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20  .  if( c=='4' ) 
98d0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69  return pOp->p4.i
98e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
98f0: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p5;.}../*.** Com
9900: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f  pute a string fo
9910: 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20  r the "comment" 
9920: 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20  field of a VDBE 
9930: 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a  opcode listing..
9940: 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73  **.** The Synops
9950: 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d  is: field in com
9960: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62  ments in the vdb
9970: 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20  e.c source file 
9980: 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a  gets converted.*
9990: 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74  * to an extra st
99a0: 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70  ring that is app
99b0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c  ended to the sql
99c0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
99d0: 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73  .  In the.** abs
99e0: 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f  ence of other co
99f0: 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e  mments, this syn
9a00: 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68  opsis becomes th
9a10: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
9a20: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65   opcode..** Some
9a30: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63   translation occ
9a40: 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  urs:.**.**      
9a50: 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22   "PX"      ->  "
9a60: 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22  r[X]".**       "
9a70: 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b  PX@PY"   ->  "r[
9a80: 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22  X..X+Y-1]"  or "
9a90: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20  r[x]" if y is 0 
9aa0: 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50  or 1.**       "P
9ab0: 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58  X@PY+1" ->  "r[X
9ac0: 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72  ..X+Y]"    or "r
9ad0: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a  [x]" if y is 0.*
9ae0: 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22  *       "PY..PY"
9af0: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20    ->  "r[X..Y]" 
9b00: 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69       or "r[x]" i
9b10: 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63  f y<=x.*/.static
9b20: 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d   int displayComm
9b30: 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20  ent(.  const Op 
9b40: 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pOp,     /* The
9b50: 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f   opcode to be co
9b60: 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e  mmented */.  con
9b70: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20  st char *zP4,   
9b80: 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62  /* Previously ob
9b90: 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72  tained value for
9ba0: 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   P4 */.  char *z
9bb0: 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57  Temp,       /* W
9bc0: 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65  rite result here
9bd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20   */.  int nTemp 
9be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
9bf0: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a  e available in z
9c00: 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63  Temp[] */.){.  c
9c10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
9c20: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
9c30: 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69   *zSynopsis;.  i
9c40: 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e  nt nOpName;.  in
9c50: 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72  t ii, jj;.  char
9c60: 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70   zAlt[50];.  zOp
9c70: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70  Name = sqlite3Op
9c80: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
9c90: 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65  code);.  nOpName
9ca0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9cb0: 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69  30(zOpName);.  i
9cc0: 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61  f( zOpName[nOpNa
9cd0: 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me+1] ){.    int
9ce0: 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20   seenCom = 0;.  
9cf0: 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53    char c;.    zS
9d00: 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d  ynopsis = zOpNam
9d10: 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31  e += nOpName + 1
9d20: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
9d30: 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20  p(zSynopsis,"IF 
9d40: 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)==0 ){.     
9d50: 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
9d60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b  QLITE_STOREP2 ){
9d70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9d80: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
9d90: 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72  (zAlt), zAlt, "r
9da0: 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53  [P2] = (%s)", zS
9db0: 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20  ynopsis+3);.    
9dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9dd0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9de0: 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20  f(sizeof(zAlt), 
9df0: 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74  zAlt, "if %s got
9e00: 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73  o P2", zSynopsis
9e10: 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +3);.      }.   
9e20: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
9e30: 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Alt;.    }.    f
9e40: 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e  or(ii=jj=0; jj<n
9e50: 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a  Temp-1 && (c = z
9e60: 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30  Synopsis[ii])!=0
9e70: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
9e80: 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20  f( c=='P' ){.   
9e90: 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73       c = zSynops
9ea0: 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20  is[++ii];.      
9eb0: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a    if( c=='4' ){.
9ec0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9ed0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9ee0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
9ef0: 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20  %s", zP4);.     
9f00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
9f10: 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'X' ){.         
9f20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9f30: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
9f40: 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  p+jj, "%s", pOp-
9f50: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
9f60: 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20        seenCom = 
9f70: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
9f80: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
9f90: 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v1 = translateP(
9fa0: 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  c, pOp);.       
9fb0: 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20     int v2;.     
9fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
9fd0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
9fe0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20  zTemp+jj, "%d", 
9ff0: 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  v1);.          i
a000: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
a010: 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c  psis+ii+1, "@P",
a020: 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   2)==0 ){.      
a030: 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20        ii += 3;. 
a040: 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d             jj +=
a050: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a060: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
a070: 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61          v2 = tra
a080: 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69  nslateP(zSynopsi
a090: 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20  s[ii], pOp);.   
a0a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
a0b0: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
a0c0: 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29  i+1,"+1",2)==0 )
a0d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a0e0: 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ii += 2;.       
a0f0: 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20         v2++;.   
a100: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a110: 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20         if( v2>1 
a120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a130: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a140: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
a150: 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31  p+jj, "..%d", v1
a160: 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  +v2-1);.        
a170: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a180: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
a190: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
a1a0: 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20  , "..P3", 4)==0 
a1b0: 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b  && pOp->p3==0 ){
a1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20  .            ii 
a1d0: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
a1e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
a1f0: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
a200: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
a210: 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  jj);.      }else
a220: 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  {.        zTemp[
a230: 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20  jj++] = c;.     
a240: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a250: 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c   !seenCom && jj<
a260: 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e  nTemp-5 && pOp->
a270: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
a280: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a290: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
a2a0: 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70  mp+jj, "; %s", p
a2b0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
a2c0: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
a2d0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
a2e0: 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  +jj);.    }.    
a2f0: 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a  if( jj<nTemp ) z
a300: 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20  Temp[jj] = 0;.  
a310: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a  }else if( pOp->z
a320: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  Comment ){.    s
a330: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a340: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
a350: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
a360: 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c  t);.    jj = sql
a370: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
a380: 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mp);.  }else{.  
a390: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
a3a0: 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a      jj = 0;.  }.
a3b0: 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23    return jj;.}.#
a3c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a3d0: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44  DEBUG */..#if VD
a3e0: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26  BE_DISPLAY_P4 &&
a3f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a400: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
a410: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  NTS)./*.** Trans
a420: 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78 70  late the P4.pExp
a430: 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f  r value for an O
a440: 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63  P_CursorHint opc
a450: 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a  ode into text.**
a460: 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69 73   that can be dis
a470: 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50 34  played in the P4
a480: 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41   column of EXPLA
a490: 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74  IN output..*/.st
a4a0: 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
a4b0: 79 50 34 45 78 70 72 28 53 74 72 41 63 63 75 6d  yP4Expr(StrAccum
a4c0: 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72   *p, Expr *pExpr
a4d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
a4e0: 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74  *zOp = 0;.  swit
a4f0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
a510: 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ING:.      sqlit
a520: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
a530: 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  , "%Q", pExpr->u
a540: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
a550: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a560: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
a570: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a580: 70 65 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70  pendf(p, "%d", p
a590: 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
a5a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a5b0: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
a5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a5d0: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55  r_appendf(p, "NU
a5e0: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
a5f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
a600: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
a610: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a620: 65 6e 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c  endf(p, "r[%d]",
a630: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
a640: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a650: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a660: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
a670: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
a680: 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
a690: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a6a0: 6e 64 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b  ndf(p, "rowid");
a6b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a6d0: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25  r_appendf(p, "c%
a6e0: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
a6f0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
a700: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a710: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a720: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
a730: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
a740: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
a750: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
a760: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a770: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
a780: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
a790: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a7a0: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
a7b0: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
a7c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a7d0: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
a7e0: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
a7f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a800: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
a810: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
a820: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
a830: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
a840: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
a850: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
a860: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
a870: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
a880: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
a890: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
a8a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a8b0: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
a8c0: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
a8d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a8e0: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
a8f0: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
a900: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a910: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
a920: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
a930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
a940: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
a950: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a960: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
a970: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
a980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a990: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
a9a0: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
a9b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a9c0: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
a9d0: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
a9e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a9f0: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
aa00: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
aa10: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
aa20: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
aa30: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
aa40: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
aa50: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
aa60: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
aa70: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
aa80: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
aa90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aaa0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
aab0: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
aac0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aad0: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
aae0: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
aaf0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
ab00: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
ab10: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
ab20: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
ab30: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
ab40: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
ab50: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
ab60: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
ab70: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
ab80: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
ab90: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
aba0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
abb0: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
abc0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
abd0: 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b  , "%s", "expr");
abe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
abf0: 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a  }..  if( zOp ){.
ac00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
ac10: 61 70 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22  appendf(p, "%s("
ac20: 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70  , zOp);.    disp
ac30: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
ac40: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
ac50: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
ac60: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
ac70: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c  e3_str_append(p,
ac80: 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ",", 1);.      
ac90: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c  displayP4Expr(p,
aca0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
acb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
acc0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c  e3_str_append(p,
acd0: 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a   ")", 1);.  }.}.
ace0: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
acf0: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
ad00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
ad10: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
ad20: 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44   */...#if VDBE_D
ad30: 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20  ISPLAY_P4./*.** 
ad40: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
ad50: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
ad60: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
ad70: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
ad80: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
ad90: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
ada0: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
adb0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
adc0: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
add0: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
ade0: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
adf0: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
ae00: 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75  zTemp;.  StrAccu
ae10: 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  m x;.  assert( n
ae20: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71  Temp>=20 );.  sq
ae30: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
ae40: 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20  t(&x, 0, zTemp, 
ae50: 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69  nTemp, 0);.  swi
ae60: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
ae70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
ae80: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
ae90: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65   int j;.      Ke
aea0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
aeb0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
aec0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
aed0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
aee0: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
aef0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
af00: 70 70 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64  ppendf(&x, "k(%d
af10: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  ", pKeyInfo->nKe
af20: 79 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66  yField);.      f
af30: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
af40: 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a  fo->nKeyField; j
af50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
af60: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
af70: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
af80: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
af90: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43  char *zColl = pC
afa0: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
afb0: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  me : "";.       
afc0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c   if( strcmp(zCol
afd0: 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20  l, "BINARY")==0 
afe0: 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20  ) zColl = "B";. 
aff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
b000: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b010: 2c 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20  ,%s%s", .       
b020: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
b030: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
b040: 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c  ? "-" : "", zCol
b050: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
b060: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
b070: 70 65 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29  pend(&x, ")", 1)
b080: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b090: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
b0a0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
b0b0: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
b0c0: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
b0d0: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 26   displayP4Expr(&
b0e0: 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72  x, pOp->p4.pExpr
b0f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b100: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b110: 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51   case P4_COLLSEQ
b120: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
b130: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e  q *pColl = pOp->
b140: 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  p4.pColl;.      
b150: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b160: 6e 64 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29  ndf(&x, "(%.20s)
b170: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
b180: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b190: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b1a0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
b1b0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
b1c0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
b1d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b1e0: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b1f0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
b200: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
b210: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b220: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
b230: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
b240: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
b250: 50 52 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73  PROFILE).    cas
b260: 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a  e P4_FUNCCTX: {.
b270: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
b280: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  Def = pOp->p4.pC
b290: 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20  tx->pFunc;.     
b2a0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b2b0: 65 6e 64 66 28 26 78 2c 20 22 25 73 28 25 64 29  endf(&x, "%s(%d)
b2c0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
b2d0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
b2e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b2f0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
b300: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
b310: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
b320: 70 65 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22  pendf(&x, "%lld"
b330: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
b340: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b350: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b360: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
b370: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b380: 6e 64 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f  ndf(&x, "%d", pO
b390: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
b3a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b3b0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
b3c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b3d0: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b3e0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
b3f0: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
b400: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b410: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
b420: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
b430: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
b440: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
b450: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
b460: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
b470: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
b480: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
b490: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
b4a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b4b0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b4c0: 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e  , "%lld", pMem->
b4d0: 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.i);.      }els
b4e0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
b4f0: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
b500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b510: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b520: 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75  "%.16g", pMem->u
b530: 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
b540: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
b550: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
b560: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55         zP4 = "NU
b570: 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  LL";.      }else
b580: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b590: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
b5a0: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
b5b0: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62      zP4 = "(blob
b5c0: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )";.      }.    
b5d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b5e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b5f0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
b600: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
b610: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b620: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
b630: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
b640: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
b650: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b660: 26 78 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70  &x, "vtab:%p", p
b670: 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65  Vtab);.      bre
b680: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
b690: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
b6a0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69  ARRAY: {.      i
b6b0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
b6c0: 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69  *ai = pOp->p4.ai
b6d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
b6e0: 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20  ai[0];   /* The 
b6f0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
b700: 20 61 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20   an INTARRAY is 
b710: 61 6c 77 61 79 73 20 74 68 65 0a 20 20 20 20 20  always the.     
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68    ** count of th
b740: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
b750: 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ents to follow *
b760: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  /.      for(i=1;
b770: 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=n; i++){.   
b780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b790: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25  _appendf(&x, ",%
b7a0: 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20  d", ai[i]);.    
b7b0: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
b7c0: 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20  0] = '[';.      
b7d0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b7e0: 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a  nd(&x, "]", 1);.
b7f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b800: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
b810: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
b820: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b830: 70 70 65 6e 64 66 28 26 78 2c 20 22 70 72 6f 67  ppendf(&x, "prog
b840: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
b850: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b860: 73 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20  se P4_DYNBLOB:. 
b870: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
b880: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
b890: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
b8a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b8b0: 20 63 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20   case P4_TABLE: 
b8c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b8d0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b8e0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54  "%s", pOp->p4.pT
b8f0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
b900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b910: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
b920: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
b930: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
b940: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
b950: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
b960: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
b970: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
b980: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  }.  }.  sqlite3S
b990: 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78  trAccumFinish(&x
b9a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34  );.  assert( zP4
b9b0: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
b9c0: 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  zP4;.}.#endif /*
b9d0: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
b9e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61   */../*.** Decla
b9f0: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
ba00: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
ba10: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
ba20: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
ba30: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
ba40: 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74  tatements need t
ba50: 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  o know in advanc
ba60: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  e the complete s
ba70: 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65  et of.** attache
ba80: 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  d databases that
ba90: 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41   will be use.  A
baa0: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
bab0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
bac0: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
bad0: 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20  btreeMask.  The 
bae0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75  p->lockMask valu
baf0: 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20  e is the subset 
bb00: 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61  of.** p->btreeMa
bb10: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  sk of databases 
bb20: 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
bb30: 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  e a lock..*/.voi
bb40: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
bb50: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
bb60: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
bb70: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
bb80: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
bb90: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
bba0: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
bbb0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
bbc0: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
bbd0: 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e  .  DbMaskSet(p->
bbe0: 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20  btreeMask, i);. 
bbf0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
bc00: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
bc10: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
bc20: 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61  pBt) ){.    DbMa
bc30: 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  skSet(p->lockMas
bc40: 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  k, i);.  }.}..#i
bc50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
bc60: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
bc70: 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  CHE)./*.** If SQ
bc80: 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64  Lite is compiled
bc90: 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72   to support shar
bca0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e  ed-cache mode an
bcb0: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
bcc0: 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  fe,.** this rout
bcd0: 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20  ine obtains the 
bce0: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
bcf0: 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61   with each BtSha
bd00: 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  red structure.**
bd10: 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63   that may be acc
bd20: 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20  essed by the VM 
bd30: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
bd40: 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20  ument. In doing 
bd50: 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65  so it also.** se
bd60: 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ts the BtShared.
bd70: 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63  db member of eac
bd80: 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  h of the BtShare
bd90: 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e  d structures, en
bda0: 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  suring.** that t
bdb0: 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d  he correct busy-
bdc0: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
bdd0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72   is invoked if r
bde0: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
bdf0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
be00: 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64  threadsafe but d
be10: 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72  oes support shar
be20: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
be30: 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  hen.** sqlite3Bt
be40: 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e  reeEnter() is in
be50: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65  voked to set the
be60: 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72   BtShared.db var
be70: 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c  iables.** of all
be80: 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72   of BtShared str
be90: 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62  uctures accessib
bea0: 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62  le via the datab
beb0: 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61  ase handle .** a
bec0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
bed0: 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  he VM..**.** If 
bee0: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
bef0: 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65  readsafe and doe
bf00: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
bf10: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
bf20: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
bf30: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
bf40: 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65  .** The p->btree
bf50: 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20  Mask field is a 
bf60: 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62  bitmask of all b
bf70: 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70  trees that the p
bf80: 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74  repared .** stat
bf90: 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65  ement p will eve
bfa0: 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65  r use.  Let N be
bfb0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
bfc0: 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  its in p->btreeM
bfd0: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
bfe0: 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74  ding to btrees t
bff0: 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63  hat use shared c
c000: 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20  ache.  Then the 
c010: 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  runtime of.** th
c020: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a  is routine is N*
c030: 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20  N.  But as N is 
c040: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
c050: 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20   1, this should 
c060: 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62  not.** be a prob
c070: 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
c080: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64  ite3VdbeEnter(Vd
c090: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
c0a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c0b0: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
c0c0: 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61   nDb;.  if( DbMa
c0d0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
c0e0: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
c0f0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
c100: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
c110: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
c120: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
c130: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
c140: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
c150: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
c160: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
c170: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
c180: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
c190: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
c1a0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44  te3BtreeEnter(aD
c1b0: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
c1c0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
c1d0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c1e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
c1f0: 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f  ACHE) && SQLITE_
c200: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a  THREADSAFE>0./*.
c210: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66  ** Unlock all of
c220: 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76   the btrees prev
c230: 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79  iously locked by
c240: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
c250: 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a  e3VdbeEnter()..*
c260: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
c270: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64  NOINLINE void vd
c280: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
c290: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
c2a0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
c2b0: 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a  aDb;.  int nDb;.
c2c0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
c2d0: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
c2e0: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
c2f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
c300: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
c310: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
c320: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
c330: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
c340: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
c350: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
c360: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
c370: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76  );.    }.  }.}.v
c380: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
c390: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
c3a0: 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   if( DbMaskAllZe
c3b0: 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20  ro(p->lockMask) 
c3c0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
c3d0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
c3e0: 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b  .  vdbeLeave(p);
c3f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
c400: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
c410: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
c420: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
c430: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
c440: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
c450: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
c460: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
c470: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
c480: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
c490: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
c4a0: 70 63 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29  pc, VdbeOp *pOp)
c4b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
c4c0: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
c4d0: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
c4e0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
c4f0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
c500: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
c510: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
c520: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
c530: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
c540: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
c550: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
c560: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
c570: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
c580: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
c590: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
c5a0: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
c5b0: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
c5c0: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
c5d0: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
c5e0: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
c5f0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
c600: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
c610: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
c620: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
c630: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
c640: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
c650: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
c660: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
c670: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
c680: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
c690: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
c6a0: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
c6b0: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
c6c0: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
c6d0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
c6e0: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
c6f0: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
c700: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
c710: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
c720: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
c730: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
c740: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
c750: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d   an array of N M
c760: 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  em element..*/.s
c770: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d  tatic void initM
c780: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
c790: 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a  int N, sqlite3 *
c7a0: 64 62 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a  db, u16 flags){.
c7b0: 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30    while( (N--)>0
c7c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20   ){.    p->db = 
c7d0: 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  db;.    p->flags
c7e0: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d   = flags;.    p-
c7f0: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23  >szMalloc = 0;.#
c800: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c810: 55 47 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79  UG.    p->pScopy
c820: 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  From = 0;.#endif
c830: 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a  .    p++;.  }.}.
c840: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
c850: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
c860: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
c870: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
c880: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
c890: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
c8a0: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
c8b0: 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a   *pEnd = &p[N];.
c8c0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
c8d0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28  = p->db;.    if(
c8e0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
c8f0: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
c900: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
c910: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
c920: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
c930: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
c940: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
c950: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
c960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
c970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
c980: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
c990: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
c9a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
c9c0: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
c9d0: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
c9e0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
c9f0: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
ca00: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
ca10: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
ca20: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
ca30: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
ca40: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
ca50: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
ca60: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
ca70: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
ca80: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
ca90: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
caa0: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
cab0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
cac0: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
cad0: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
cae0: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
caf0: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
cb00: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
cb10: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
cb20: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
cb30: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
cb40: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
cb50: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
cb60: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
cb70: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
cb80: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
cb90: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
cba0: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
cbb0: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
cbc0: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
cbd0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
cbe0: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
cbf0: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
cc00: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
cc10: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
cc20: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
cc30: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
cc40: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
cc50: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
cc60: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
cc70: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
cc80: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
cc90: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
cca0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
ccb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
ccc0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
ccd0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
cce0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
ccf0: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
cd00: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 78 44 65  testcase( p->xDe
cd10: 6c 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 46 72  l==sqlite3VdbeFr
cd20: 61 6d 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20  ameMemDel );.   
cd30: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26     if( p->flags&
cd40: 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e  (MEM_Agg|MEM_Dyn
cd50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
cd60: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
cd70: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  se(p);.      }el
cd80: 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c  se if( p->szMall
cd90: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  oc ){.        sq
cda0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
cdb0: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
cdc0: 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c         p->szMall
cdd0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
cde0: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
cdf0: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
ce00: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b  .    }while( (++
ce10: 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d  p)<pEnd );.  }.}
ce20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ce30: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69  DEBUG./*.** Veri
ce40: 66 79 20 74 68 61 74 20 70 46 72 61 6d 65 20 69  fy that pFrame i
ce50: 73 20 61 20 76 61 6c 69 64 20 56 64 62 65 46 72  s a valid VdbeFr
ce60: 61 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20 52 65  ame pointer.  Re
ce70: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
ce80: 69 73 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65 20  is.** and false 
ce90: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20  if something is 
cea0: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  wrong..**.** Thi
ceb0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 74  s routine is int
cec0: 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e  ended for use in
ced0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
cee0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79   statements only
cef0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cf00: 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64  VdbeFrameIsValid
cf10: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
cf20: 6d 65 29 7b 0a 20 20 69 66 28 20 70 46 72 61 6d  me){.  if( pFram
cf30: 65 2d 3e 69 46 72 61 6d 65 4d 61 67 69 63 21 3d  e->iFrameMagic!=
cf40: 53 51 4c 49 54 45 5f 46 52 41 4d 45 5f 4d 41 47  SQLITE_FRAME_MAG
cf50: 49 43 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  IC ) return 0;. 
cf60: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
cf70: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
cf80: 20 69 73 20 61 20 64 65 73 74 72 75 63 74 6f 72   is a destructor
cf90: 20 6f 6e 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74   on a Mem object
cfa0: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
cfb0: 79 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  y an sqlite3_val
cfc0: 75 65 29 0a 2a 2a 20 74 68 61 74 20 64 65 6c 65  ue).** that dele
cfd0: 74 65 73 20 74 68 65 20 46 72 61 6d 65 20 6f 62  tes the Frame ob
cfe0: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
cff0: 61 63 68 65 64 20 74 6f 20 69 74 20 61 73 20 61  ached to it as a
d000: 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   blob..**.** Thi
d010: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
d020: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 46 72  ot delete the Fr
d030: 61 6d 65 20 72 69 67 68 74 20 61 77 61 79 2e 20  ame right away. 
d040: 20 49 74 20 6d 65 72 65 6c 79 20 61 64 64 73 20   It merely adds 
d050: 74 68 65 0a 2a 2a 20 66 72 61 6d 65 20 74 6f 20  the.** frame to 
d060: 61 20 6c 69 73 74 20 6f 66 20 66 72 61 6d 65 73  a list of frames
d070: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 77   to be deleted w
d080: 68 65 6e 20 74 68 65 20 56 64 62 65 20 68 61 6c  hen the Vdbe hal
d090: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
d0a0: 74 65 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44  te3VdbeFrameMemD
d0b0: 65 6c 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  el(void *pArg){.
d0c0: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
d0d0: 61 6d 65 20 3d 20 28 56 64 62 65 46 72 61 6d 65  ame = (VdbeFrame
d0e0: 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
d0f0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  ( sqlite3VdbeFra
d100: 6d 65 49 73 56 61 6c 69 64 28 70 46 72 61 6d 65  meIsValid(pFrame
d110: 29 20 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70  ) );.  pFrame->p
d120: 50 61 72 65 6e 74 20 3d 20 70 46 72 61 6d 65 2d  Parent = pFrame-
d130: 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20  >v->pDelFrame;. 
d140: 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c   pFrame->v->pDel
d150: 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a  Frame = pFrame;.
d160: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  }.../*.** Delete
d170: 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a   a VdbeFrame obj
d180: 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  ect and its cont
d190: 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20  ents. VdbeFrame 
d1a0: 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61  objects are.** a
d1b0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20  llocated by the 
d1c0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
d1d0: 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65  e in sqlite3Vdbe
d1e0: 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Exec()..*/.void 
d1f0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
d200: 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65  Delete(VdbeFrame
d210: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d220: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62   Mem *aMem = Vdb
d230: 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20  eFrameMem(p);.  
d240: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43  VdbeCursor **apC
d250: 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  sr = (VdbeCursor
d260: 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68   **)&aMem[p->nCh
d270: 69 6c 64 4d 65 6d 5d 3b 0a 20 20 61 73 73 65 72  ildMem];.  asser
d280: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  t( sqlite3VdbeFr
d290: 61 6d 65 49 73 56 61 6c 69 64 28 70 29 20 29 3b  ameIsValid(p) );
d2a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
d2b0: 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29  >nChildCsr; i++)
d2c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d2d0: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76  eFreeCursor(p->v
d2e0: 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  , apCsr[i]);.  }
d2f0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
d300: 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69  ay(aMem, p->nChi
d310: 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  ldMem);.  sqlite
d320: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
d330: 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d  ta(p->v->db, &p-
d340: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
d350: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d360: 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b  ee(p->v->db, p);
d370: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d380: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
d390: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
d3a0: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
d3b0: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
d3c0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
d3d0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
d3e0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
d3f0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
d400: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
d410: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
d420: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
d430: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
d440: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
d450: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
d460: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
d470: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
d480: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  EXPLAIN"..**.** 
d490: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
d4a0: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63  =1, each instruc
d4b0: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20  tion is listed. 
d4c0: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c   When.** p->expl
d4d0: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f  ain==2, only OP_
d4e0: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
d4f0: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20  ions are listed 
d500: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65  and these.** are
d510: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66   shown in a diff
d520: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70  erent format.  p
d530: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20  ->explain==2 is 
d540: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
d550: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  t.** EXPLAIN QUE
d560: 52 59 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38  RY PLAN..** 2018
d570: 2d 30 34 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65  -04-24:  In p->e
d580: 78 70 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20  xplain==2 mode, 
d590: 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f  the OP_Init opco
d5a0: 64 65 73 20 6f 66 20 74 72 69 67 67 65 72 73 0a  des of triggers.
d5b0: 2a 2a 20 61 72 65 20 61 6c 73 6f 20 73 68 6f 77  ** are also show
d5c0: 6e 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 62  n, so that the b
d5d0: 6f 75 6e 64 61 72 69 65 73 20 62 65 74 77 65 65  oundaries betwee
d5e0: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  n the main progr
d5f0: 61 6d 20 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74  am and.** each t
d600: 72 69 67 67 65 72 20 61 72 65 20 63 6c 65 61 72  rigger are clear
d610: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
d620: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73  explain==1, firs
d630: 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  t the main progr
d640: 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68  am is listed, th
d650: 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68  en each of.** th
d660: 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  e trigger subpro
d670: 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64  grams are listed
d680: 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a   one by one..*/.
d690: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c  int sqlite3VdbeL
d6a0: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20  ist(.  Vdbe *p  
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
d6d0: 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20  ){.  int nRow;  
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
d700: 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74  p when row count
d710: 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f   reaches this */
d720: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b  .  int nSub = 0;
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d750: 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73  r of sub-vdbes s
d760: 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
d770: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
d780: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
d790: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
d7a0: 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20   sub-vdbes */.  
d7b0: 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20  Mem *pSub = 0;  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
d7e0: 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f  ell hold array o
d7f0: 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20  f subprogs */.  
d800: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
d810: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
d820: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
d830: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d840: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d870: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
d880: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d890: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
d8a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
d8b0: 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  de */.  Mem *pMe
d8c0: 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  m = &p->aMem[1];
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8e0: 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73  First Mem of res
d8f0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
d900: 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 3d   bListSubprogs =
d910: 20 28 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20   (p->explain==1 
d920: 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  || (db->flags & 
d930: 53 51 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51  SQLITE_TriggerEQ
d940: 50 29 21 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f  P)!=0);.  Op *pO
d950: 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  p = 0;..  assert
d960: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
d970: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
d980: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
d990: 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  UN );.  assert( 
d9a0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d9b0: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
d9c0: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
d9d0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
d9e0: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
d9f0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
da00: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
da10: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
da20: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
da30: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
da40: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
da50: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
da60: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
da70: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
da80: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
da90: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
daa0: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
dab0: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
dac0: 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20  ray(pMem, 8);.  
dad0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
dae0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
daf0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
db00: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
db10: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
db20: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
db30: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
db40: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
db50: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
db60: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
db70: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ed.  */.    sqli
db80: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
db90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
dba0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
dbb0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
dbc0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
dbd0: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
dbe0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
dbf0: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
dc00: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
dc10: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
dc20: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
dc30: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
dc40: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
dc50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
dc60: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
dc70: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
dc80: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
dc90: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
dca0: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
dcb0: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
dcc0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
dcd0: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
dce0: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
dcf0: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
dd00: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
dd10: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
dd20: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
dd30: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
dd40: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
dd50: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
dd60: 6e 4f 70 3b 0a 20 20 69 66 28 20 62 4c 69 73 74  nOp;.  if( bList
dd70: 53 75 62 70 72 6f 67 73 20 29 7b 0a 20 20 20 20  Subprogs ){.    
dd80: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
dd90: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
dda0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
ddb0: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
ddc0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
ddd0: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
dde0: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
ddf0: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
de00: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
de10: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
de20: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
de30: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
de40: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
de50: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
de60: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
de70: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
de80: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
de90: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
dea0: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
deb0: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
dec0: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
ded0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
dee0: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
def0: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
df00: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
df10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
df20: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
df30: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
df40: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
df50: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
df60: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
df70: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
df80: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
df90: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
dfa0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
dfb0: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
dfc0: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
dfd0: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
dfe0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65    }.  }..  while
dff0: 28 31 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78  (1){  /* Loop ex
e000: 69 74 73 20 76 69 61 20 62 72 65 61 6b 20 2a 2f  its via break */
e010: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
e020: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f  ;.    if( i>=nRo
e030: 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  w ){.      p->rc
e040: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e050: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e060: 44 4f 4e 45 3b 0a 20 20 20 20 20 20 62 72 65 61  DONE;.      brea
e070: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
e080: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
e090: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
e0a0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
e0b0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
e0c0: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
e0d0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
e0e0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
e0f0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
e100: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
e110: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
e120: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
e130: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
e140: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
e150: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
e160: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
e170: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
e180: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
e190: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
e1a0: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
e1b0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
e1c0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
e1d0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
e1e0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
e1f0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
e200: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
e210: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e220: 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72  When an OP_Progr
e230: 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  am opcode is enc
e240: 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79  ounter (the only
e250: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73   opcode that has
e260: 0a 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42  .    ** a P4_SUB
e270: 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74  PROGRAM argument
e280: 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69  ), expand the si
e290: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
e2a0: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20  of subprograms. 
e2b0: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
e2c0: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
e2d0: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
e2e0: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
e2f0: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
e300: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
e310: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
e320: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62      */.    if( b
e330: 4c 69 73 74 53 75 62 70 72 6f 67 73 20 26 26 20  ListSubprogs && 
e340: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
e350: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
e360: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
e370: 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  (nSub+1)*sizeof(
e380: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
e390: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
e3a0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62   for(j=0; j<nSub
e3b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
e3c0: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
e3d0: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
e3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e3f0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75        if( j==nSu
e400: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  b ){.        p->
e410: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
e420: 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42  MemGrow(pSub, nB
e430: 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20  yte, nSub!=0);. 
e440: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
e450: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e460: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
e470: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
e4a0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
e4b0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
e4c0: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
e4d0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
e4e0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
e4f0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20   pSub->flags |= 
e500: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
e510: 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62    pSub->n = nSub
e520: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
e530: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 6e 52  am*);.        nR
e540: 6f 77 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ow += pOp->p4.pP
e550: 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20  rogram->nOp;.   
e560: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
e570: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20  f( p->explain<2 
e580: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
e590: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
e5a0: 5f 45 78 70 6c 61 69 6e 20 29 20 62 72 65 61 6b  _Explain ) break
e5b0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
e5c0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
e5d0: 26 20 70 2d 3e 70 63 3e 31 20 29 20 62 72 65 61  & p->pc>1 ) brea
e5e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  k;.  }..  if( rc
e5f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e600: 20 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73     if( db->u1.is
e610: 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20  Interrupted ){. 
e620: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
e630: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
e640: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e650: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71  _ERROR;.      sq
e660: 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
e670: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
e680: 70 2d 3e 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  p->rc));.    }el
e690: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
e6a0: 7a 50 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70  zP4;.      if( p
e6b0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
e6c0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
e6d0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e6e0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69         pMem->u.i
e6f0: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
e720: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
e730: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a     pMem++;.    .
e740: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
e750: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
e760: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
e770: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
e780: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
e790: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
e7a0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
e7b0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
e7c0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
e7d0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
e7e0: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
e7f0: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
e800: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
e810: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
e820: 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  F8;.        pMem
e830: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ++;.      }..   
e840: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e850: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e860: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
e870: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e890: 20 50 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P1 */.      pMe
e8a0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d  m++;..      pMem
e8b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e8c0: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
e8d0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
e900: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
e910: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e920: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e930: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
e940: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70  /* P3 */.      p
e970: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66  Mem++;..      if
e980: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
e990: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
e9a0: 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20  Mem, 100) ){ /* 
e9b0: 50 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  P4 */.        as
e9c0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
e9d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
e9e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e9f0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
ea00: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
ea10: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
ea20: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50  M_Term;.      zP
ea30: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
ea40: 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d  p, pMem->z, pMem
ea50: 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  ->szMalloc);.   
ea60: 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d     if( zP4!=pMem
ea70: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ->z ){.        p
ea80: 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20  Mem->n = 0;.    
ea90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
eaa0: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
eab0: 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  P4, -1, SQLITE_U
eac0: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  TF8, 0);.      }
ead0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
eae0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
eaf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   );.        pMem
eb00: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
eb10: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
eb20: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
eb30: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
eb40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
eb50: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66  Mem++;..      if
eb60: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
eb70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
eb80: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
eb90: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
eba0: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
ebb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
ebc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ebe0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
ebf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ec00: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ec10: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
ec20: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
ec30: 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 73  n = 2;.        s
ec40: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ec50: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
ec60: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
ec70: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 20  /* P5 */.       
ec80: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
ec90: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
eca0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23    pMem++;.    .#
ecb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ecc0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
ecd0: 45 4e 54 53 0a 20 20 20 20 20 20 20 20 69 66 28  ENTS.        if(
ece0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
ecf0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
ed00: 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20  em, 500) ){.    
ed10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ed20: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ed30: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d );.          r
ed40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
ed50: 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
ed60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ed70: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
ed80: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d  Term;.        pM
ed90: 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43  em->n = displayC
eda0: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
edb0: 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a   pMem->z, 500);.
edc0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
edd0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
ede0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70  .#else.        p
edf0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ee00: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee20: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
ee30: 66 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  f.      }..     
ee40: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
ee50: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
ee60: 69 6e 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  in-1);.      p->
ee70: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d  pResultSet = &p-
ee80: 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  >aMem[1];.      
ee90: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
eea0: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  K;.      rc = SQ
eeb0: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a  LITE_ROW;.    }.
eec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
eed0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eee0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
eef0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ef00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
ef10: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
ef20: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
ef30: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
ef40: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
ef50: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
ef60: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
ef70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
ef80: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
ef90: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
efa0: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
efb0: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
efc0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
efd0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
efe0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
eff0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
f000: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
f010: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
f020: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
f030: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
f040: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
f050: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
f060: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
f070: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
f080: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
f090: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
f0a0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
f0b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
f0c0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
f0d0: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
f0e0: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
f0f0: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
f100: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
f110: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
f120: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
f130: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
f140: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
f150: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
f160: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
f170: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
f180: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
f190: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
f1a0: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
f1b0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
f1c0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
f1d0: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
f1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
f1f0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
f200: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
f210: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
f220: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
f230: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
f240: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
f250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f260: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
f270: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
f280: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
f290: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
f2a0: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
f2b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f2c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
f2d0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
f2e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
f2f0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
f300: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
f310: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
f320: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
f330: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
f340: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
f350: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20  TRACE */../* An 
f360: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
f370: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
f380: 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  s bulk memory av
f390: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a  ailable for use.
f3a0: 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65  ** by subcompone
f3b0: 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65  nts of a prepare
f3c0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70  d statement.  Sp
f3d0: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
f3e0: 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75   out.** of a Reu
f3f0: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
f400: 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70  t by the allocSp
f410: 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65  ace() routine be
f420: 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  low..*/.struct R
f430: 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20  eusableSpace {. 
f440: 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20   u8 *pSpace;    
f450: 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62        /* Availab
f460: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  le memory */.  i
f470: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
f480: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
f490: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
f4a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65   */.  int nNeede
f4b0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  d;         /* To
f4c0: 74 61 6c 20 62 79 74 65 73 20 74 68 61 74 20 63  tal bytes that c
f4d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f  ould not be allo
f4e0: 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  cated */.};../* 
f4f0: 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  Try to allocate 
f500: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 38  nByte bytes of 8
f510: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75  -byte aligned bu
f520: 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42  lk memory for pB
f530: 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52  uf.** from the R
f540: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
f550: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
f560: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
f570: 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72  located.** memor
f580: 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  y on success.  I
f590: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d  f insufficient m
f5a0: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
f5b0: 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75  le in the.** Reu
f5c0: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
f5d0: 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  t, increase the 
f5e0: 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e  ReusableSpace.nN
f5f0: 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62  eeded.** value b
f600: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65  y the amount nee
f610: 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ded and return N
f620: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ULL..**.** If pB
f630: 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  uf is not initia
f640: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d  lly NULL, that m
f650: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65  eans that the me
f660: 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64 79  mory has already
f670: 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
f680: 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ed by a prior ca
f690: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
f6a0: 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ne, so just retu
f6b0: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
f6c0: 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52  pBuf and leave R
f6d0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63  eusableSpace unc
f6e0: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  hanged..**.** Th
f6f0: 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  is allocator is 
f700: 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75  employed to repu
f710: 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f  rpose unused slo
f720: 74 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ts at the end of
f730: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61   the.** opcode a
f740: 72 72 61 79 20 6f 66 20 70 72 65 70 61 72 65 64  rray of prepared
f750: 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72   state for other
f760: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66   memory needs of
f770: 20 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a   the prepared.**
f780: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
f790: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
f7a0: 63 53 70 61 63 65 28 0a 20 20 73 74 72 75 63 74  cSpace(.  struct
f7b0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a   ReusableSpace *
f7c0: 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f  p,  /* Bulk memo
f7d0: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
f7e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
f7f0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
f800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
f810: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72  inter to a prior
f820: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
f830: 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
f840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
f850: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  tes of memory ne
f860: 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  eded */.){.  ass
f870: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
f880: 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70  ALIGNMENT(p->pSp
f890: 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42  ace) );.  if( pB
f8a0: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79  uf==0 ){.    nBy
f8b0: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
f8c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
f8d0: 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b  e <= p->nFree ){
f8e0: 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20  .      p->nFree 
f8f0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  -= nByte;.      
f900: 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63  pBuf = &p->pSpac
f910: 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20  e[p->nFree];.   
f920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
f930: 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74  >nNeeded += nByt
f940: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  e;.    }.  }.  a
f950: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
f960: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66  E_ALIGNMENT(pBuf
f970: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  ) );.  return pB
f980: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
f990: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
f9a0: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
f9b0: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
f9c0: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
f9d0: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
f9e0: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
f9f0: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
fa00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
fa10: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
fa20: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
fa30: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
fa40: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
fa50: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
fa60: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
fa70: 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  T || p->magic==V
fa80: 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20  DBE_MAGIC_RESET 
fa90: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
faa0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
fab0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
fac0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
fad0: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
fae0: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
faf0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
fb00: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
fb10: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
fb20: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
fb30: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
fb40: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
fb50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d  for(i=0; i<p->nM
fb60: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
fb70: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
fb80: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
fb90: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
fba0: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
fbb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
fbc0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
fbd0: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43  E_Abort;.  p->nC
fbe0: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
fbf0: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
fc00: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
fc10: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
fc20: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
fc30: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
fc40: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
fc50: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
fc60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
fc70: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
fc80: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
fc90: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
fca0: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
fcb0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
fcc0: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
fcd0: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
fce0: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
fcf0: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
fd00: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
fd10: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
fd20: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
fd30: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
fd40: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69   allocating regi
fd50: 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61  sters and initia
fd60: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
fd70: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
fd80: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
fd90: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
fda0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
fdb0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
fdc0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
fdd0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
fde0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
fdf0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
fe00: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ed exactly once 
fe10: 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20  on each virtual 
fe20: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
fe30: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
fe40: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
fe50: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
fe60: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
fe70: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
fe80: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
fe90: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68  is called, furth
fea0: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  er calls to .** 
feb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fec0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  () functions are
fed0: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68   prohibited.  Th
fee0: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f  is routine disco
fef0: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64  nnects.** the Vd
ff00: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  be from the Pars
ff10: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65  e object that he
ff20: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74  lped generate it
ff30: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
ff40: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73  the Vdbe becomes
ff50: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20   an independent 
ff60: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50  entity and the P
ff70: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20  arse object can 
ff80: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  be.** destroyed.
ff90: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
ffa0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
ffb0: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  () procedure to 
ffc0: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61  restore a virtua
ffd0: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a  l machine back.*
ffe0: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c  * to its initial
fff0: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20   state after it 
10000 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f  has been run..*/
10010 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
10020 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
10030 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10050 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61  The VDBE */.  Pa
10060 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20  rse *pParse     
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10080 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10090 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
100a0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
100b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
100c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
100d0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  n */.  int nVar;
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10100 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  of parameters */
10110 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56    /* Number of V
10140 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  M memory registe
10150 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  rs */.  int nCur
10160 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
10170 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10180 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75   of cursors requ
10190 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ired */.  int nA
101a0 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
101b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
101c0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
101d0 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  in subprograms *
101e0 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10210 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52  er */.  struct R
10220 65 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20  eusableSpace x; 
10230 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62         /* Reusab
10240 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a  le bulk memory *
10250 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  /..  assert( p!=
10260 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
10270 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
10280 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
10290 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
102a0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
102b0 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
102c0 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50  t( pParse==p->pP
102d0 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70  arse );.  db = p
102e0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
102f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10300 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
10310 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
10320 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
10330 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
10340 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
10350 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
10360 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a  nMaxArg;.  .  /*
10370 20 45 61 63 68 20 63 75 72 73 6f 72 20 75 73 65   Each cursor use
10380 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  s a memory cell.
10390 20 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73    The first curs
103a0 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20 63 61  or (cursor 0) ca
103b0 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b  n.  ** use aMem[
103c0 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  0] which is not 
103d0 6f 74 68 65 72 77 69 73 65 20 75 73 65 64 20 62  otherwise used b
103e0 79 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  y the VDBE progr
103f0 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20  am.  Allocate.  
10400 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ** space at the 
10410 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f  end of aMem[] fo
10420 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20  r cursors 1 and 
10430 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65  greater..  ** Se
10440 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
10450 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
10460 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
10470 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d  ;.  if( nCursor=
10480 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e  =0 && nMem>0 ) n
10490 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65  Mem++;  /* Space
104a0 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65   for aMem[0] eve
104b0 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f  n if not used */
104c0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
104d0 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61  t how much reusa
104e0 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ble memory is av
104f0 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65  ailable at the e
10500 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f  nd of the.  ** o
10510 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
10520 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  is extra memory 
10530 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61  will be realloca
10540 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c  ted for other el
10550 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74  ements.  ** of t
10560 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
10570 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20  ement..  */.  n 
10580 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
10590 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20  Op)*p->nOp);    
105a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
105b0 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d  es of opcode mem
105c0 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e  ory used */.  x.
105d0 70 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29  pSpace = &((u8*)
105e0 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20  p->aOp)[n];     
105f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
10600 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72  sed opcode memor
10610 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  y */.  assert( E
10620 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
10630 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b  ENT(x.pSpace) );
10640 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55  .  x.nFree = ROU
10650 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e  NDDOWN8(pParse->
10660 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20  szOpAlloc - n); 
10670 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75   /* Bytes of unu
10680 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  sed memory */.  
10690 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e  assert( x.nFree>
106a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
106b0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
106c0 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78  MENT(&x.pSpace[x
106d0 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72  .nFree]) );..  r
106e0 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
106f0 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
10700 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
10710 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
10720 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
10730 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
10740 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
10750 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
10760 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
10770 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70  10;.  }.  p->exp
10780 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ired = 0;..  /* 
10790 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73  Memory for regis
107a0 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73  ters, parameters
107b0 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69  , cursor, etc, i
107c0 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f  s allocated in o
107d0 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70  ne or two.  ** p
107e0 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
107f0 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
10800 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
10810 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20  d memory at the 
10820 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
10830 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
10840 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
10850 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
10860 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
10870 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
10880 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
10890 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
108a0 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
108b0 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
108c0 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
108d0 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65  using a fresh me
108e0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  mory allocation.
108f0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
10900 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f  s two-pass appro
10910 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20  ach that reuses 
10920 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
10930 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a  s possible from.
10940 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
10950 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20  r memory at the 
10960 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
10970 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 63  e array.  This c
10980 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
10990 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
109a0 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
109b0 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
109c0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
109d0 20 20 2a 2f 0a 20 20 78 2e 6e 4e 65 65 64 65 64    */.  x.nNeeded
109e0 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20   = 0;.  p->aMem 
109f0 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
10a00 20 30 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28   0, nMem*sizeof(
10a10 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e 61 56 61 72  Mem));.  p->aVar
10a20 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
10a30 2c 20 30 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  , 0, nVar*sizeof
10a40 28 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e 61 70 41  (Mem));.  p->apA
10a50 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
10a60 26 78 2c 20 30 2c 20 6e 41 72 67 2a 73 69 7a 65  &x, 0, nArg*size
10a70 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 70 2d 3e  of(Mem*));.  p->
10a80 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
10a90 63 65 28 26 78 2c 20 30 2c 20 6e 43 75 72 73 6f  ce(&x, 0, nCurso
10aa0 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
10ab0 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53  sor*));.#ifdef S
10ac0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
10ad0 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 70  T_SCANSTATUS.  p
10ae0 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63  ->anExec = alloc
10af0 53 70 61 63 65 28 26 78 2c 20 30 2c 20 70 2d 3e  Space(&x, 0, p->
10b00 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29  nOp*sizeof(i64))
10b10 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 78  ;.#endif.  if( x
10b20 2e 6e 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  .nNeeded ){.    
10b30 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46  x.pSpace = p->pF
10b40 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
10b50 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78  allocRawNN(db, x
10b60 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78  .nNeeded);.    x
10b70 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64  .nFree = x.nNeed
10b80 65 64 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  ed;.    if( !db-
10b90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10ba0 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  .      p->aMem =
10bb0 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10bc0 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
10bd0 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20  zeof(Mem));.    
10be0 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
10bf0 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56  cSpace(&x, p->aV
10c00 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
10c10 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Mem));.      p->
10c20 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
10c30 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c  ce(&x, p->apArg,
10c40 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
10c50 2a 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  *));.      p->ap
10c60 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
10c70 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e  (&x, p->apCsr, n
10c80 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
10c90 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66  beCursor*));.#if
10ca0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10cb0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
10cc0 53 0a 20 20 20 20 20 20 70 2d 3e 61 6e 45 78 65  S.      p->anExe
10cd0 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  c = allocSpace(&
10ce0 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d  x, p->anExec, p-
10cf0 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29  >nOp*sizeof(i64)
10d00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
10d10 20 20 7d 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74    }..  p->pVList
10d20 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73   = pParse->pVLis
10d30 74 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 56 4c  t;.  pParse->pVL
10d40 69 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65  ist =  0;.  p->e
10d50 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d  xplain = pParse-
10d60 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20  >explain;.  if( 
10d70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10d80 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20   ){.    p->nVar 
10d90 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72  = 0;.    p->nCur
10da0 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  sor = 0;.    p->
10db0 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nMem = 0;.  }els
10dc0 65 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  e{.    p->nCurso
10dd0 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20  r = nCursor;.   
10de0 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
10df0 72 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69 74  r)nVar;.    init
10e00 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
10e10 2c 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f  , nVar, db, MEM_
10e20 4e 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d  Null);.    p->nM
10e30 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69  em = nMem;.    i
10e40 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  nitMemArray(p->a
10e50 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d  Mem, nMem, db, M
10e60 45 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20  EM_Undefined);. 
10e70 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43     memset(p->apC
10e80 73 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73  sr, 0, nCursor*s
10e90 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
10ea0 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  *));.#ifdef SQLI
10eb0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
10ec0 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 6d 65  CANSTATUS.    me
10ed0 6d 73 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20  mset(p->anExec, 
10ee0 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  0, p->nOp*sizeof
10ef0 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (i64));.#endif. 
10f00 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
10f10 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
10f20 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
10f30 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
10f40 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
10f50 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
10f60 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
10f70 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
10f80 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
10f90 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
10fa0 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
10fb0 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
10fc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10fd0 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70    assert( pCx->p
10fe0 42 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65  Btx==0 || pCx->e
10ff0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
11000 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74  _BTREE );.  swit
11010 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70  ch( pCx->eCurTyp
11020 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55  e ){.    case CU
11030 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a  RTYPE_SORTER: {.
11040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11050 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
11060 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20  db, pCx);.      
11070 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11080 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54   case CURTYPE_BT
11090 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  REE: {.      if(
110a0 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61   pCx->isEphemera
110b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
110c0 20 70 43 78 2d 3e 70 42 74 78 20 29 20 73 71 6c   pCx->pBtx ) sql
110d0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
110e0 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20 20  Cx->pBtx);.     
110f0 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
11100 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
11110 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
11120 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
11130 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  , by.        ** 
11140 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
11150 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
11160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11170 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  pCx->uc.pCursor!
11180 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
11190 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
111a0 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43  ursor(pCx->uc.pC
111b0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
111c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
111d0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
111e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
111f0 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55 52  BLE.    case CUR
11200 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20  TYPE_VTAB: {.   
11210 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
11220 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20  cursor *pVCur = 
11230 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20  pCx->uc.pVCur;. 
11240 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74       const sqlit
11250 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
11260 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61  le = pVCur->pVta
11270 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  b->pModule;.    
11280 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72 2d    assert( pVCur-
11290 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29  >pVtab->nRef>0 )
112a0 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70  ;.      pVCur->p
112b0 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Vtab->nRef--;.  
112c0 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
112d0 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20  ose(pVCur);.    
112e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
112f0 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
11300 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
11310 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72  sors in the curr
11320 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74  ent frame..*/.st
11330 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43  atic void closeC
11340 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64  ursorsInFrame(Vd
11350 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
11360 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
11370 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
11380 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
11390 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
113a0 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
113b0 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
113c0 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
113d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
113e0 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
113f0 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
11400 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
11410 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11420 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
11430 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
11440 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
11450 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
11460 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
11470 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
11480 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
11490 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
114a0 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
114b0 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
114c0 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
114d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
114e0 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
114f0 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
11500 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
11510 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f  pFrame->v;.  clo
11520 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
11530 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (v);.#ifdef SQLI
11540 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
11550 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61  CANSTATUS.  v->a
11560 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e  nExec = pFrame->
11570 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20  anExec;.#endif. 
11580 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
11590 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
115a0 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
115b0 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
115c0 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
115d0 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
115e0 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
115f0 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
11600 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
11610 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
11620 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
11630 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
11640 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
11650 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
11660 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e  hange;.  v->db->
11670 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
11680 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73  ->nDbChange;.  s
11690 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
116a0 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26  AuxData(v->db, &
116b0 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  v->pAuxData, -1,
116c0 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61   0);.  v->pAuxDa
116d0 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75  ta = pFrame->pAu
116e0 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d  xData;.  pFrame-
116f0 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20  >pAuxData = 0;. 
11700 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e   return pFrame->
11710 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  pc;.}../*.** Clo
11720 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  se all cursors..
11730 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61  **.** Also relea
11740 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d  se any dynamic m
11750 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
11760 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65  e VM in the Vdbe
11770 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a  .aMem memory .**
11780 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69   cell array. Thi
11790 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61  s is necessary a
117a0 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  s the memory cel
117b0 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74  l array may cont
117c0 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20  ain.** pointers 
117d0 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  to VdbeFrame obj
117e0 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ects, which may 
117f0 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20  in turn contain 
11800 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f  pointers to.** o
11810 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  pen cursors..*/.
11820 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
11830 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65  eAllCursors(Vdbe
11840 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
11850 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
11860 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
11870 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
11880 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
11890 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
118a0 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
118b0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
118c0 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
118d0 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  pFrame);.    p->
118e0 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  pFrame = 0;.    
118f0 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->nFrame = 0;. 
11900 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
11910 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63  nFrame==0 );.  c
11920 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
11930 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  me(p);.  if( p->
11940 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
11950 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
11960 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
11970 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
11980 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  DelFrame ){.    
11990 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20  VdbeFrame *pDel 
119a0 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  = p->pDelFrame;.
119b0 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65      p->pDelFrame
119c0 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74   = pDel->pParent
119d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
119e0 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65  eFrameDelete(pDe
119f0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  l);.  }..  /* De
11a00 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61  lete any auxdata
11a10 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64   allocations mad
11a20 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20  e by the VM */. 
11a30 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61   if( p->pAuxData
11a40 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65   ) sqlite3VdbeDe
11a50 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64  leteAuxData(p->d
11a60 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c  b, &p->pAuxData,
11a70 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72   -1, 0);.  asser
11a80 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d  t( p->pAuxData==
11a90 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  0 );.}../*.** Se
11aa0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
11ab0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
11ac0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
11ad0 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
11ae0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
11af0 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
11b00 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
11b10 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
11b20 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
11b30 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
11b40 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
11b50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
11b60 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
11b70 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
11b80 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
11b90 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
11ba0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
11bb0 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
11bc0 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
11bd0 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  lumn){.  int n;.
11be0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11bf0 70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d  p->db;..  if( p-
11c00 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20  >nResColumn ){. 
11c10 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
11c20 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
11c30 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
11c40 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 20 20 73 71  LNAME_N);.    sq
11c50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11c60 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
11c70 7d 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  }.  n = nResColu
11c80 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20  mn*COLNAME_N;.  
11c90 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
11ca0 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b  (u16)nResColumn;
11cb0 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
11cc0 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
11cd0 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
11ce0 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
11cf0 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
11d00 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
11d10 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70    initMemArray(p
11d20 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64  ->aColName, n, d
11d30 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a  b, MEM_Null);.}.
11d40 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
11d50 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
11d60 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
11d70 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
11d80 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
11d90 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
11da0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
11db0 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
11dc0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
11dd0 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
11de0 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
11df0 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
11e00 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
11e10 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   The final param
11e20 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74  eter, xDel, must
11e30 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   be one of SQLIT
11e40 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54  E_DYNAMIC, SQLIT
11e50 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53  E_STATIC.** or S
11e60 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e  QLITE_TRANSIENT.
11e70 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45   If it is SQLITE
11e80 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74  _DYNAMIC, then t
11e90 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
11ea0 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65  d.** to by zName
11eb0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
11ec0 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  y sqlite3DbFree(
11ed0 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
11ee0 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f  is destroyed..*/
11ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11f00 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64  SetColName(.  Vd
11f10 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f30 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e  * Vdbe being con
11f40 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74  figured */.  int
11f50 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f70 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
11f80 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74   zName applies t
11f90 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20  o */.  int var, 
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
11fc0 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20  f the COLNAME_* 
11fd0 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63  constants */.  c
11fe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
11ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12000 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
12010 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
12020 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  name */.  void (
12030 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20  *xDel)(void*)   
12040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
12050 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
12060 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61  strategy for zNa
12070 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  me */.){.  int r
12080 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
12090 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
120a0 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
120b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
120c0 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
120d0 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
120e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
120f0 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c  ssert( !zName ||
12100 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59   xDel!=SQLITE_DY
12110 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74  NAMIC );.    ret
12120 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12130 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
12140 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
12150 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
12160 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
12170 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
12180 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
12190 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
121a0 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
121b0 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
121c0 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
121d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
121e0 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
121f0 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
12200 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
12210 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12220 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
12230 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
12240 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
12250 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
12260 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
12270 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
12280 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
12290 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
122a0 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
122b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
122c0 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
122d0 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
122e0 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
122f0 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
12300 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12310 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
12320 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
12330 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
12340 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
12350 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
12360 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
12370 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
12380 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
12390 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
123a0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
123b0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
123c0 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
123d0 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
123e0 69 74 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20  it using a.     
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
12400 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
12410 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
12420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
12430 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
12440 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12450 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
12460 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20  .  /* With this 
12470 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56  option, sqlite3V
12480 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66  tabSync() is def
12490 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c  ined to be simpl
124a0 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  y .  ** SQLITE_O
124b0 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73  K so p is not us
124c0 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ed. .  */.  UNUS
124d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
124e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
124f0 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
12500 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74  ing else, call t
12510 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  he xSync() callb
12520 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a  ack for any.  **
12530 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
12540 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69  tables written i
12550 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
12560 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a  on. This has to.
12570 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66    ** be done bef
12580 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ore determining 
12590 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72  whether a master
125a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
125b0 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c   .  ** required,
125c0 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63   as an xSync() c
125d0 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20  allback may add 
125e0 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
125f0 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  base.  ** to the
12600 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
12610 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
12620 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29  3VtabSync(db, p)
12630 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
12640 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29  p determines (a)
12650 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68   if the commit h
12660 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ook should be in
12670 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28  voked and.  ** (
12680 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61  b) how many data
12690 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20  base files have 
126a0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
126b0 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20  actions, not .  
126c0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
126d0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20   temp database. 
126e0 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  (b) is important
126f0 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65   because if more
12700 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20   than .  ** one 
12710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
12720 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  s an open write 
12730 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d  transaction, a m
12740 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
12750 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  ** file is requi
12760 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69  red for an atomi
12770 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a  c commit..  */ .
12780 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
12790 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
127a0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
127b0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
127c0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
127d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
127e0 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
127f0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68  ) ){.      /* Wh
12800 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64  ether or not a d
12810 61 74 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65  atabase might ne
12820 65 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ed a master jour
12830 6e 61 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e  nal depends upon
12840 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f  .      ** its jo
12850 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e  urnal mode (amon
12860 67 20 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e  g other things).
12870 20 20 54 68 69 73 20 6d 61 74 72 69 78 20 64 65    This matrix de
12880 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20  termines which. 
12890 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
128a0 6d 6f 64 65 73 20 75 73 65 20 61 20 6d 61 73 74  modes use a mast
128b0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77  er journal and w
128c0 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20  hich do not */. 
128d0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
128e0 74 20 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d  t u8 aMJNeeded[]
128f0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
12900 44 45 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a  DELETE   */  1,.
12910 20 20 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49          /* PERSI
12920 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20  ST   */ 1,.     
12930 20 20 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20     /* OFF       
12940 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 0,.        /*
12950 20 54 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c   TRUNCATE  */ 1,
12960 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f  .        /* MEMO
12970 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  RY    */ 0,.    
12980 20 20 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20      /* WAL      
12990 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20   */ 0.      };. 
129a0 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
129b0 65 72 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61  er;   /* Pager a
129c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
129d0 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64  Bt */.      need
129e0 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
129f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
12a00 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  nter(pBt);.     
12a10 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
12a20 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
12a30 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
12a40 61 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[i].safety_le
12a50 76 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel!=PAGER_SYNCH
12a60 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20  RONOUS_OFF.     
12a70 20 20 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73    && aMJNeeded[s
12a80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f  qlite3PagerGetJo
12a90 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
12aa0 29 5d 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  )].       && sql
12ab0 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
12ac0 28 70 50 61 67 65 72 29 3d 3d 30 0a 20 20 20 20  (pPager)==0.    
12ad0 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61 73    ){ .        as
12ae0 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20 20  sert( i!=1 );.  
12af0 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a        nTrans++;.
12b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
12b10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
12b20 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
12b30 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
12b40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
12b50 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
12b60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12b70 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
12b80 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
12b90 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
12ba0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
12bb0 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
12bc0 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
12bd0 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
12be0 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
12bf0 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
12c00 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
12c10 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
12c20 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
12c30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12c50 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
12c60 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  THOOK;.    }.  }
12c70 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
12c80 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
12c90 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
12ca0 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
12cb0 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
12cc0 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
12cd0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
12ce0 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
12cf0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
12d00 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
12d10 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
12d20 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
12d30 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
12d40 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
12d50 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
12d60 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
12d70 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
12d80 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
12d90 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d  memory: or a tem
12da0 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a  p file.  In .  *
12db0 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  * that case we d
12dc0 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  o not support at
12dd0 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
12de0 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
12df0 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
12e00 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a   case then too..
12e10 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71    */.  if( 0==sq
12e20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
12e30 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
12e40 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
12e50 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72  .pBt)).   || nTr
12e60 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20  ans<=1.  ){.    
12e70 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
12e80 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
12e90 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
12ea0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12eb0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12ec0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
12ed0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12ee0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12ef0 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
12f00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12f10 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
12f20 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
12f30 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
12f40 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
12f50 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
12f60 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
12f70 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
12f80 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
12f90 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
12fa0 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
12fb0 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
12fc0 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
12fd0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
12fe0 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
12ff0 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
13000 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
13010 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
13020 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
13030 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
13040 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
13050 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
13060 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
13070 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
13080 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13090 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
130a0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
130b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
130c0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
130d0 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  o(pBt, 0);.     
130e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
130f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13100 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
13110 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
13120 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
13130 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
13140 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
13150 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
13160 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
13170 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
13180 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
13190 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
131a0 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
131b0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
131c0 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c  mitted atomicall
131d0 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
131e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
131f0 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
13200 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
13210 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
13220 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
13230 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
13240 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
13250 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
13260 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
13270 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
13280 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
13290 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
132a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
132b0 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
132c0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
132d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
132e0 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
132f0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
13300 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
13310 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
13320 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13330 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
13340 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
13350 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
13360 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
13370 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
13380 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
13390 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
133a0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
133b0 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
133c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
133d0 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  KPT;.    do {.  
133e0 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
133f0 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
13400 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
13410 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
13420 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
13430 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
13440 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
13450 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
13460 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
13470 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
13480 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
13490 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
134a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
134b0 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
134c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
134d0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
134e0 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
134f0 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
13500 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
13510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
13520 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
13530 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
13540 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
13550 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
13560 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
13570 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
13580 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
13590 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
135c0 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
135d0 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
135e0 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
135f0 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
13600 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
13610 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13620 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
13630 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
13640 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
13650 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
13660 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
13670 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13680 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
13690 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
136a0 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
136b0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
136c0 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
136d0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
136e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
136f0 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
13700 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
13710 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
13720 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
13730 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
13740 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
13750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13760 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
13770 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
13780 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
13790 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
137a0 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
137b0 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
137c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
137d0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
137e0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
137f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13800 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
13810 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
13820 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
13830 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
13840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
13860 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
13870 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
13880 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13890 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
138a0 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
138b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
138c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
138d0 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
138e0 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
138f0 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
13900 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
13910 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
13920 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
13930 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
13940 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
13950 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
13960 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
13970 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
13980 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
13990 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
139a0 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
139b0 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
139c0 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
139d0 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
139e0 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
139f0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
13a00 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
13a10 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
13a20 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
13a30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
13a40 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
13a50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
13a60 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
13a70 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
13a80 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
13a90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
13aa0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
13ab0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
13ac0 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
13ad0 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
13ae0 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
13af0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
13b00 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
13b10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13b20 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
13b30 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
13b40 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
13b50 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
13b60 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
13b70 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
13b80 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
13b90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13bb0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13bc0 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
13bd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13be0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
13bf0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
13c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
13c10 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
13c20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
13c30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
13c40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13c50 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
13c60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13c70 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
13c80 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
13c90 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
13ca0 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
13cb0 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
13cc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d    */.    if( 0==
13cd0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
13ce0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
13cf0 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
13d00 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
13d10 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
13d20 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
13d30 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
13d40 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
13d50 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20  RMAL)).    ){.  
13d60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13d70 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
13d80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13d90 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
13da0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
13db0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13dc0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13de0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
13df0 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
13e00 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
13e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
13e20 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
13e30 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
13e40 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
13e50 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
13e60 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
13e70 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
13e80 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
13e90 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
13ea0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13eb0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
13ec0 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
13ed0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
13ee0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
13ef0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
13f00 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
13f10 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
13f20 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
13f30 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
13f40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13f50 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
13f60 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
13f70 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
13f80 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
13f90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13fa0 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
13fb0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
13fc0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
13fd0 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
13fe0 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
13ff0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
14000 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
14010 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
14020 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
14030 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
14040 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
14050 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
14060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14070 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
14080 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
14090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
140a0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
140b0 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
140c0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
140d0 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
140e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
140f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      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 44 65 6c 65 74 65 20 74  .    /* Delete t
14140 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
14150 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
14160 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
14170 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
14180 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
14190 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
141a0 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
141b0 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
141c0 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
141d0 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
141e0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
141f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14200 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
14210 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
14220 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14230 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
14240 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
14250 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14260 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14270 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
14280 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
14290 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
142a0 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
142b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
142c0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
142d0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
142e0 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
142f0 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
14300 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
14310 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
14320 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
14330 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
14340 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
14350 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
14360 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
14370 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
14380 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
14390 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
143a0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
143b0 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
143c0 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
143d0 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
143e0 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
143f0 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
14400 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
14410 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
14420 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
14430 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
14440 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
14450 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
14460 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
14470 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
14480 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
14490 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
144a0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
144b0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
144c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
144d0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
144e0 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
144f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
14500 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14510 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
14520 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
14530 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
14540 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
14550 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
14560 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14570 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
14580 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
14590 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62  the sqlite3.nVdb
145a0 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61  eActive count va
145b0 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65  riable.** matche
145c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
145d0 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69  vdbe's in the li
145e0 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65  st sqlite3.pVdbe
145f0 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72   that are.** cur
14600 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41  rently active. A
14610 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
14620 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75  s if the two cou
14630 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
14640 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
14650 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68  internal self-ch
14660 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73  eck only - it is
14670 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61   not an essentia
14680 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  l processing.** 
14690 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  step..**.** This
146a0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
146b0 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
146c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
146d0 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
146e0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
146f0 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  nt(sqlite3 *db){
14700 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e  .  Vdbe *p;.  in
14710 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
14720 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69   nWrite = 0;.  i
14730 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20  nt nRead = 0;.  
14740 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
14750 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
14760 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d   if( sqlite3_stm
14770 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f  t_busy((sqlite3_
14780 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20  stmt*)p) ){.    
14790 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
147a0 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  f( p->readOnly==
147b0 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  0 ) nWrite++;.  
147c0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
147d0 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a  ader ) nRead++;.
147e0 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
147f0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
14800 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e  sert( cnt==db->n
14810 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20  VdbeActive );.  
14820 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
14830 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
14840 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61  ;.  assert( nRea
14850 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  d==db->nVdbeRead
14860 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
14870 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
14880 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
14890 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
148a0 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
148b0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
148c0 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
148d0 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
148e0 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
148f0 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
14900 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
14910 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14920 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
14930 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
14940 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
14950 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
14960 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
14970 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
14980 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
14990 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
149a0 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
149b0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
149c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
149d0 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
149e0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
149f0 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
14a00 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
14a10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
14a20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
14a30 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
14a40 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
14a50 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f 73 65  NE int vdbeClose
14a60 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
14a70 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
14a80 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
14a90 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
14aa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14ab0 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
14ac0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
14ad0 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
14ae0 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4f  1;..  assert( eO
14af0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
14b00 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
14b10 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
14b20 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
14b30 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
14b40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
14b50 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
14b60 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
14b70 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66  vepoint) );..  f
14b80 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
14b90 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e  b; i++){ .    in
14ba0 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
14bb0 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  K;.    Btree *pB
14bc0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
14bd0 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
14be0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
14bf0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
14c00 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
14c10 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
14c20 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
14c30 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
14c40 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
14c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14c60 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
14c70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
14c80 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
14c90 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
14ca0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14cb0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
14cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14ce0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
14cf0 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
14d00 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61  }.  }.  db->nSta
14d10 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69  tement--;.  p->i
14d20 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
14d30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 65  _OK ){.    if( e
14d50 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
14d60 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
14d70 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
14d80 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
14d90 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14da0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
14db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
14dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14dd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14de0 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
14df0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
14e00 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
14e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14e20 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
14e30 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
14e40 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
14e50 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
14e60 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  e the .  ** data
14e70 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
14e80 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
14e90 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
14ea0 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
14eb0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  n .  ** the stat
14ec0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14ed0 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
14ee0 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56  /.  if( eOp==SAV
14ef0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14f00 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  ){.    db->nDefe
14f10 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
14f20 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
14f30 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
14f40 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
14f50 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20  efImmCons;.  }. 
14f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
14f70 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
14f80 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
14f90 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
14fa0 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61   if( p->db->nSta
14fb0 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
14fc0 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72  atement ){.    r
14fd0 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 65 53  eturn vdbeCloseS
14fe0 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29  tatement(p, eOp)
14ff0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15000 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
15010 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
15020 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
15030 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
15040 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
15050 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
15060 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15070 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
15080 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
15090 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
150a0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
150b0 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
150c0 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
150d0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
150e0 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
150f0 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
15100 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
15110 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
15120 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
15130 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
15140 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
15150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
15160 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
15170 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
15180 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
15190 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
151a0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
151b0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
151c0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
151d0 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
151e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
151f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15200 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
15210 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
15220 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
15230 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
15240 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
15250 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
15260 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
15270 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
15280 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
15290 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
152a0 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
152b0 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
152c0 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
152d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
152e0 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
152f0 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
15300 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
15310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
15320 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e  rror(p, "FOREIGN
15330 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
15340 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
15350 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
15360 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
15370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
15380 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
15390 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
153a0 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
153b0 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
153c0 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
153d0 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
153e0 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
153f0 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
15400 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
15410 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
15420 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
15430 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
15440 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
15450 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15460 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
15470 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
15480 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
15490 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
154a0 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
154b0 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
154c0 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
154d0 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
154e0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
154f0 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
15500 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
15510 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15520 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
15530 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
15540 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
15550 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
15560 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
15570 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
15580 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
15590 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
155a0 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
155b0 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
155c0 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
155d0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
155e0 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
155f0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
15620 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
15630 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
15640 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
15650 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
15660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
15670 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
15680 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
15690 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
156a0 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
156b0 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
156c0 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
156d0 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
156e0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
156f0 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
15700 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
15710 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
15720 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15730 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
15740 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
15750 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
15760 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
15770 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
15780 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
15790 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
157a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
157b0 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
157c0 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
157d0 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
157e0 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
157f0 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
15800 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
15810 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
15820 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
15830 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
15840 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
15850 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
15860 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
15870 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
15880 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  */..  if( p->mag
15890 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
158a0 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
158b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
158c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
158d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
158e0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
158f0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63  EM_BKPT;.  }.  c
15900 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
15910 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  );.  checkActive
15920 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
15930 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
15940 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
15950 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
15960 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
15970 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
15980 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
15990 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
159a0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
159b0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
159c0 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
159d0 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
159e0 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
159f0 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
15a00 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
15a10 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
15a20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
15a30 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
15a40 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
15a50 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
15a60 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
15a70 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
15a80 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
15a90 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
15aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
15ab0 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
15ac0 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
15ad0 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
15ae0 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
15af0 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
15b00 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
15b10 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
15b20 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
15b30 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
15b60 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
15b70 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
15b80 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
15b90 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
15ba0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
15bb0 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
15bc0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15bd0 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
15be0 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
15bf0 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
15c00 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
15c10 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
15c20 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
15c30 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
15c40 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
15c50 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
15c60 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
15c70 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
15c80 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
15c90 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
15ca0 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
15cb0 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
15cc0 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
15cd0 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
15ce0 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
15cf0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
15d00 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
15d10 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
15d20 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
15d30 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
15d40 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
15d50 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
15d60 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
15d70 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
15d80 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
15d90 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
15da0 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
15db0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
15dc0 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
15dd0 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
15de0 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
15df0 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
15e00 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
15e10 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
15e20 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
15e30 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
15e40 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
15e50 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
15e60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
15e70 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
15e80 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
15e90 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
15ea0 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
15eb0 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
15ec0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
15ed0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
15ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ef0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
15f00 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
15f10 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
15f20 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
15f30 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
15f40 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
15f50 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
15f60 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
15f70 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
15f80 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
15f90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
15fa0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
15fb0 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
15fc0 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
15fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
15fe0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
15ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
16000 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
16010 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
16020 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
16030 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16040 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
16050 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  for immediate fo
16060 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
16070 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ions. */.    if(
16080 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16090 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
160a0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
160b0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
160c0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
160d0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
160e0 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
160f0 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
16100 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56  writer .    ** V
16110 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69  M, then we do ei
16120 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
16130 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
16140 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
16150 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
16160 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
16170 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
16180 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
16190 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
161a0 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
161b0 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  ve has occurred.
161c0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
161d0 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53   !sqlite3VtabInS
161e0 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26  ync(db) .     &&
161f0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
16200 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64  .     && db->nVd
16210 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61  beWrite==(p->rea
16220 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29  dOnly==0) .    )
16230 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
16240 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
16250 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
16260 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
16270 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
16280 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16290 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
162a0 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  p, 1);.        i
162b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
162c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
162d0 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f  ( NEVER(p->readO
162e0 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
162f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
16300 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
16310 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16320 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
16330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16340 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
16350 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
16360 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
16370 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  { .          /* 
16380 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
16390 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
163a0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
163b0 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
163c0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68           ** or h
163d0 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
163e0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
163f0 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65  here are no defe
16400 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20  rred foreign.   
16410 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f         ** key co
16420 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c  nstraints to hol
16430 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  d up the transac
16440 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
16450 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
16460 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
16470 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
16480 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
16490 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
164a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
164b0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
164c0 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  && p->readOnly )
164d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
164e0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
164f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16500 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
16510 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16530 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
16540 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
16550 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
16560 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
16570 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  OK);.          p
16580 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
16590 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
165a0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
165b0 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
165c0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
165d0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
165e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
165f0 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29  >flags &= ~(u64)
16600 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
16610 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16620 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
16630 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
16640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
16650 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
16660 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
16670 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
16680 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
16690 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
166a0 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
166b0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
166c0 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
166d0 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
166e0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
166f0 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
16700 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
16710 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
16720 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
16730 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
16740 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
16750 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
16760 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
16770 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
16780 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
16790 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
167a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
167b0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
167c0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
167d0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
167e0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
167f0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
16800 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
16810 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
16820 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
16830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16840 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
16850 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
16860 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
16870 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
16880 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
16890 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
168a0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
168b0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
168c0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
168d0 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
168e0 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
168f0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
16900 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
16910 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
16920 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
16930 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
16940 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
16950 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
16960 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
16970 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
16980 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
16990 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
169a0 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
169b0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
169c0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
169d0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
169e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
169f0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
16a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
16a10 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
16a20 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
16a30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
16a40 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
16a50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16a60 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
16a70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
16a80 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
16a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
16aa0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
16ab0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
16ac0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
16ad0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
16ae0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
16af0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
16b00 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
16b10 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
16b20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
16b30 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
16b40 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
16b50 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
16b60 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
16b70 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
16b80 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
16b90 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
16ba0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
16bb0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
16bc0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
16bd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
16be0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
16bf0 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
16c00 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
16c10 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
16c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16c30 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
16c40 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
16c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
16c70 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
16c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
16c90 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
16ca0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
16cb0 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
16cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16cd0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  Leave(p);.  }.. 
16ce0 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
16cf0 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
16d00 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
16d10 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
16d20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
16d30 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
16d40 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d  b->nVdbeActive--
16d50 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
16d60 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64  adOnly ) db->nVd
16d70 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69  beWrite--;.    i
16d80 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
16d90 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
16da0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
16db0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
16dc0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
16dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
16de0 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
16df0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
16e00 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
16e10 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
16e20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
16e30 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
16e40 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
16e50 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
16e60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
16e70 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
16e80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
16e90 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
16ea0 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
16eb0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
16ec0 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
16ed0 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
16ee0 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
16ef0 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
16f00 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
16f10 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
16f20 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
16f30 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
16f40 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
16f50 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
16f60 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
16f70 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
16f80 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
16f90 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
16fa0 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
16fb0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
16fc0 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d  eActive>0 || db-
16fd0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  >autoCommit==0 |
16fe0 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  | db->nStatement
16ff0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
17000 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42  (p->rc==SQLITE_B
17010 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  USY ? SQLITE_BUS
17020 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  Y : SQLITE_OK);.
17030 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
17040 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
17050 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
17060 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
17070 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
17080 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
17090 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
170a0 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
170b0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
170c0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
170d0 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
170e0 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
170f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
17100 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65  /*.** Copy the e
17110 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
17120 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f  ror message belo
17130 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42  nging to the VDB
17140 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  E passed.** as t
17150 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
17160 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73  t to its databas
17170 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61  e handle (so tha
17180 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a  t they will be .
17190 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63  ** returned by c
171a0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
171b0 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71  errcode() and sq
171c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e  lite3_errmsg()).
171d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
171e0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c  tion does not cl
171f0 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72  ear the VDBE err
17200 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61  or code or messa
17210 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69  ge, just.** copi
17220 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64  es them to the d
17230 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
17240 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17250 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
17260 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
17270 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
17280 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
17290 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  c;.  if( p->zErr
172a0 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62  Msg ){.    db->b
172b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a  BenignMalloc++;.
172c0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
172d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
172e0 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72      if( db->pErr
172f0 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d  ==0 ) db->pErr =
17300 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
17310 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
17320 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
17330 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
17340 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
17350 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
17360 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
17370 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
17380 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65  c();.    db->bBe
17390 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20  nignMalloc--;.  
173a0 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 70 45  }else if( db->pE
173b0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
173c0 33 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62  3ValueSetNull(db
173d0 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64  ->pErr);.  }.  d
173e0 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  b->errCode = rc;
173f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17400 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17410 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
17420 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
17430 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
17440 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
17450 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
17460 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
17470 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
17480 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
17490 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
174a0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
174b0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
174c0 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
174d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
174e0 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
174f0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
17500 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
17510 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
17520 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
17530 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
17540 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
17550 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
17560 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17570 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
17580 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
17590 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
175a0 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
175b0 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
175c0 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
175d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
175e0 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
175f0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
17600 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
17610 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
17620 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
17630 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
17640 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
17650 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
17660 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
17670 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
17680 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
17690 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
176a0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
176b0 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
176c0 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
176d0 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
176e0 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
176f0 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
17700 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
17710 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
17720 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
17730 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
17740 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
17750 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
17760 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
17770 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
17780 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
17790 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
177a0 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
177b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
177c0 74 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20  t(Vdbe *p){.#if 
177d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
177e0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
177f0 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20  (VDBE_PROFILE). 
17800 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 0a   int i;.#endif..
17810 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
17820 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
17830 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
17840 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
17850 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
17860 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
17870 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
17880 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
17890 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
178a0 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
178b0 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
178c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
178d0 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
178e0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
178f0 65 65 6e 20 72 75 6e 20 65 76 65 6e 20 70 61 72  een run even par
17900 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
17910 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
17920 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
17930 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
17940 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
17950 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
17960 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
17970 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
17980 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
17990 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
179a0 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
179b0 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
179c0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
179d0 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
179e0 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
179f0 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
17a00 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
17a10 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
17a20 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71      vdbeInvokeSq
17a30 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c  llog(p);.    sql
17a40 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
17a50 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 69 66  Error(p);.    if
17a60 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65  ( p->runOnlyOnce
17a70 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20   ) p->expired = 
17a80 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
17a90 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72  ->rc && p->expir
17aa0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
17ab0 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61   expired flag wa
17ac0 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42  s set on the VDB
17ad0 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  E before the fir
17ae0 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  st call.    ** t
17af0 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
17b00 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  . For consistenc
17b10 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33  y (since sqlite3
17b20 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20  _step() was.    
17b30 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20  ** called), set 
17b40 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72  the database err
17b50 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  or in this case 
17b60 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  as well..    */.
17b70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17b80 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72  WithMsg(db, p->r
17b90 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20  c, p->zErrMsg ? 
17ba0 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72  "%s" : 0, p->zEr
17bb0 72 4d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rMsg);.  }..  /*
17bc0 20 52 65 73 65 74 20 72 65 67 69 73 74 65 72 20   Reset register 
17bd0 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 72 65 63  contents and rec
17be0 6c 61 69 6d 20 65 72 72 6f 72 20 6d 65 73 73 61  laim error messa
17bf0 67 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a  ge memory..  */.
17c00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17c10 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
17c20 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
17c30 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
17c40 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
17c50 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
17c60 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
17c70 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
17c80 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
17c90 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   */.  if( p->apC
17ca0 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
17cb0 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
17cc0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
17cd0 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
17ce0 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
17cf0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d  for(i=0; i<p->nM
17d00 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  em; i++) assert(
17d10 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
17d20 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  s==MEM_Undefined
17d30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
17d40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17d50 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
17d60 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
17d70 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
17d80 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  t = 0;.#ifdef SQ
17d90 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
17da0 6e 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  nWrite = 0;.#end
17db0 69 66 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  if..  /* Save pr
17dc0 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
17dd0 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
17de0 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
17df0 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
17e00 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
17e10 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
17e20 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
17e30 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
17e40 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
17e50 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
17e60 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
17e70 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
17e80 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
17e90 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
17ea0 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
17eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
17ec0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
17ed0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a  ;.      if( p->z
17ee0 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Sql ){.        c
17ef0 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20  har c, pc = 0;. 
17f00 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
17f10 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
17f20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
17f30 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30  = p->zSql[i])!=0
17f40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17f50 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29    if( pc=='\n' )
17f60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
17f70 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  - ");.          
17f80 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
17f90 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a          pc = c;.
17fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17fb0 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29    if( pc!='\n' )
17fc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
17fd0 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
17fe0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
17ff0 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
18000 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30      char zHdr[10
18010 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0];.        sqli
18020 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
18030 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c  eof(zHdr), zHdr,
18040 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c   "%6u %12llu %8l
18050 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lu ",.          
18060 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
18070 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
18080 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
18090 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
180a0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
180b0 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
180c0 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
180d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
180e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
180f0 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20  ", zHdr);.      
18100 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
18110 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
18120 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
18130 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
18140 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
18150 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
18160 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 45   = VDBE_MAGIC_RE
18170 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  SET;.  return p-
18180 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
18190 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
181a0 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
181b0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
181c0 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
181d0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
181e0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
181f0 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
18200 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
18210 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
18220 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
18230 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
18240 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
18250 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18260 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
18270 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
18280 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
18290 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
182a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
182b0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
182c0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
182d0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
182e0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
182f0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
18300 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
18310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
18320 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
18330 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
18340 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
18350 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
18360 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
18370 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
18380 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
18390 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
183a0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
183b0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
183c0 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
183d0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
183e0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
183f0 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
18400 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
18410 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
18420 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
18430 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
18440 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
18450 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
18460 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
18470 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
18480 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
18490 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
184a0 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
184b0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
184c0 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
184d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
184e0 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
184f0 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
18500 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
18510 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
18520 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
18530 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
18540 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
18550 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
18560 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
18570 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
18580 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62  corresponds to b
18590 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
185a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
185b0 65 6c 65 74 65 41 75 78 44 61 74 61 28 73 71 6c  eleteAuxData(sql
185c0 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61 74  ite3 *db, AuxDat
185d0 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c  a **pp, int iOp,
185e0 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68   int mask){.  wh
185f0 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20  ile( *pp ){.    
18600 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
18610 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f  *pp;.    if( (iO
18620 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41  p<0).     || (pA
18630 75 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 0a  ux->iAuxOp==iOp.
18640 20 20 20 20 20 20 20 20 20 20 26 26 20 70 41 75            && pAu
18650 78 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20 20  x->iAuxArg>=0.  
18660 20 20 20 20 20 20 20 20 26 26 20 28 70 41 75 78          && (pAux
18670 2d 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c 20  ->iAuxArg>31 || 
18680 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
18690 33 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67  32(pAux->iAuxArg
186a0 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
186b0 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78    testcase( pAux
186c0 2d 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29 3b  ->iAuxArg==31 );
186d0 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
186e0 3e 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a 20  >xDeleteAux ){. 
186f0 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
18700 6c 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70 41  leteAux(pAux->pA
18710 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
18720 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70     *pp = pAux->p
18730 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20 73  NextAux;.      s
18740 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18750 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73   pAux);.    }els
18760 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41  e{.      pp= &pA
18770 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20  ux->pNextAux;.  
18780 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
18790 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
187a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
187b0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
187c0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
187d0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65  rgument,.** exce
187e0 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74  pt for object it
187f0 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70  self, which is p
18800 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
18810 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
18820 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
18830 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
18840 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
18850 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
18860 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
18870 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
18880 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
18890 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
188a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
188b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66  connection and f
188c0 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20  rees the object 
188d0 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20  itself..*/.void 
188e0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
188f0 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
18900 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
18910 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
18920 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  , *pNext;.  asse
18930 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
18940 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
18950 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
18960 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
18970 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
18980 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
18990 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
189a0 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
189b0 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
189c0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
189d0 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
189e0 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
189f0 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
18a00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18a10 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sub);.  }.  if( 
18a20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
18a30 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20  AGIC_INIT ){.   
18a40 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
18a50 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
18a60 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
18a70 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56 4c  bFree(db, p->pVL
18a80 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
18a90 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
18aa0 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64 62  Free);.  }.  vdb
18ab0 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
18ac0 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
18ad0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
18ae0 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
18af0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
18b00 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
18b10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18b20 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45  ENABLE_NORMALIZE
18b30 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
18b40 28 64 62 2c 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c  (db, p->zNormSql
18b50 29 3b 0a 20 20 7b 0a 20 20 20 20 44 62 6c 71 75  );.  {.    Dblqu
18b60 6f 74 65 53 74 72 20 2a 70 54 68 69 73 2c 20 2a  oteStr *pThis, *
18b70 70 4e 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70  pNext;.    for(p
18b80 54 68 69 73 3d 70 2d 3e 70 44 62 6c 53 74 72 3b  This=p->pDblStr;
18b90 20 70 54 68 69 73 3b 20 70 54 68 69 73 3d 70 4e   pThis; pThis=pN
18ba0 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
18bb0 74 20 3d 20 70 54 68 69 73 2d 3e 70 4e 65 78 74  t = pThis->pNext
18bc0 53 74 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Str;.      sqlit
18bd0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 68  e3DbFree(db, pTh
18be0 69 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  is);.    }.  }.#
18bf0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
18c00 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
18c10 53 43 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20  SCANSTATUS.  {. 
18c20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
18c30 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61  r(i=0; i<p->nSca
18c40 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
18c50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18c60 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61   p->aScan[i].zNa
18c70 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
18c80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18c90 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a   p->aScan);.  }.
18ca0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
18cb0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
18cc0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
18cd0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
18ce0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
18cf0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 61 73 73  ite3 *db;..  ass
18d00 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
18d10 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
18d20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18d30 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
18d40 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  x) );.  sqlite3V
18d50 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64  dbeClearObject(d
18d60 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, p);.  if( p->
18d70 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
18d80 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
18d90 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
18da0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
18db0 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
18dc0 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
18dd0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
18de0 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
18df0 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
18e00 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
18e10 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
18e20 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
18e30 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
18e40 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
18e50 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
18e60 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68  The cursor "p" h
18e70 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65  as a pending see
18e80 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
18e90 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
18ea0 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74  n.** carried out
18eb0 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73  .  Seek the curs
18ec0 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65  or now.  If an e
18ed0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
18ee0 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  urn.** the appro
18ef0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
18f00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18f10 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
18f20 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
18f30 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
18f40 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c   *p){.  int res,
18f50 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
18f60 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
18f70 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
18f80 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
18f90 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  f.  assert( p->d
18fa0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b  eferredMoveto );
18fb0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73  .  assert( p->is
18fc0 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
18fd0 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
18fe0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
18ff0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
19000 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
19010 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
19020 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
19030 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
19040 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
19050 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21  n rc;.  if( res!
19060 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
19070 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19080 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19090 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  EST.  sqlite3_se
190a0 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
190b0 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72  ndif.  p->deferr
190c0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
190d0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
190e0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
190f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74  ;.}../*.** Somet
19110 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63  hing has moved c
19120 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66  ursor "p" out of
19130 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74   place.  Maybe t
19140 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a  he row it was.**
19150 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20   pointed to was 
19160 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
19170 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d   under it.  Or m
19180 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77  aybe the btree w
19190 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64  as.** rebalanced
191a0 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20  .  Whatever the 
191b0 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65  cause, try to re
191c0 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65  store "p" to the
191d0 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20   place it.** is 
191e0 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70  supposed to be p
191f0 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65  ointing.  If the
19200 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64   row was deleted
19210 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
19220 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73  the.** cursor, s
19230 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  et the cursor to
19240 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c   point to a NULL
19250 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
19260 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
19270 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  INE handleMovedC
19280 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72  ursor(VdbeCursor
19290 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69   *p){.  int isDi
192a0 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a  fferentRow, rc;.
192b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
192c0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
192d0 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
192e0 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  ( p->uc.pCursor!
192f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19300 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
19310 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
19320 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72  .pCursor) );.  r
19330 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19340 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d  CursorRestore(p-
19350 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73  >uc.pCursor, &is
19360 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20  DifferentRow);. 
19370 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
19380 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
19390 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74   if( isDifferent
193a0 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77  Row ) p->nullRow
193b0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
193c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
193d0 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  k to ensure that
193e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
193f0 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74  alid.  Restore t
19400 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20  he cursor.** if 
19410 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e  need be.  Return
19420 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66   any I/O error f
19430 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20  rom the restore 
19440 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  operation..*/.in
19450 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
19460 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43  sorRestore(VdbeC
19470 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
19480 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
19490 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
194a0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
194b0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
194c0 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
194d0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
194e0 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
194f0 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
19500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19510 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
19520 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
19530 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
19540 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
19550 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
19560 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
19570 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
19580 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
19590 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
195a0 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
195b0 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
195c0 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
195d0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
195e0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
195f0 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
19600 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
19610 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
19620 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
19630 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
19640 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
19650 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
19660 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
19670 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
19680 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
19690 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
196a0 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
196b0 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
196c0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
196d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
196e0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
196f0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
19700 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
19710 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
19720 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
19730 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
19740 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
19750 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19760 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
19770 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
19780 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
19790 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69  or **pp, int *pi
197a0 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73  Col){.  VdbeCurs
197b0 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 61  or *p = *pp;.  a
197c0 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
197d0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
197e0 45 20 7c 7c 20 70 2d 3e 65 43 75 72 54 79 70 65  E || p->eCurType
197f0 3d 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f  ==CURTYPE_PSEUDO
19800 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66   );.  if( p->def
19810 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
19820 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20     int iMap;.   
19830 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20   if( p->aAltMap 
19840 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41  && (iMap = p->aA
19850 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29  ltMap[1+*piCol])
19860 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  >0 ){.      *pp 
19870 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b  = p->pAltCursor;
19880 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20  .      *piCol = 
19890 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20  iMap - 1;.      
198a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
198b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
198c0 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65  rn handleDeferre
198d0 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a  dMoveto(p);.  }.
198e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
198f0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
19900 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
19910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
19920 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
19930 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
19940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19950 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
19960 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
19970 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
19980 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
19990 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
199a0 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
199b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
199c0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
199d0 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
199e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
199f0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
19a00 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
19a10 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
19a20 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
19a30 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
19a40 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
19a50 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
19a60 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
19a70 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
19a80 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
19a90 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
19aa0 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
19ab0 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
19ac0 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
19ad0 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
19ae0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
19af0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
19b00 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
19b10 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
19b20 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
19b30 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
19b40 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
19b50 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
19b60 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
19b70 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
19b80 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
19b90 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
19ba0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
19bb0 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
19bc0 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
19bd0 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
19be0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
19bf0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
19c00 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
19c10 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
19c20 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
19c30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
19c40 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
19c50 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
19c60 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
19c70 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
19c80 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
19c90 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
19ca0 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
19cb0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
19cc0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
19cd0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
19ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
19cf0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
19d00 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
19d10 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
19d20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
19d30 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
19d40 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
19d50 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
19d80 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
19d90 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
19da0 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
19db0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19dc0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
19dd0 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
19de0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
19df0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
19e00 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
19e30 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
19e40 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
19e50 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
19e60 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
19e70 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
19ea0 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
19eb0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
19ec0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
19ed0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
19ee0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
19ef0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
19f00 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
19f10 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
19f20 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
19f30 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
19f60 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
19f70 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
19f80 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
19f90 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
19fa0 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
19fb0 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
19fc0 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
19fd0 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
19fe0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
19ff0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
1a000 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
1a010 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
1a020 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
1a030 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
1a040 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
1a050 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1a060 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
1a070 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
1a080 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
1a090 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1a0a0 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
1a0b0 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
1a0c0 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20  t, u32 *pLen){. 
1a0d0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
1a0e0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20  m->flags;.  u32 
1a0f0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  n;..  assert( pL
1a100 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66  en!=0 );.  if( f
1a110 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
1a120 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a  .    *pLen = 0;.
1a130 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a140 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
1a150 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
1a160 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
1a170 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
1a180 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
1a190 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
1a1a0 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
1a1b0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
1a1c0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
1a1d0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
1a1e0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
1a1f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
1a200 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
1a210 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
1a220 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
1a230 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
1a240 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
1a250 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
1a260 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
1a270 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b         return 8+
1a280 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65  (u32)u;.      }e
1a290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  lse{.        *pL
1a2a0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
1a2b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1a2c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1a2d0 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65  u<=32767 ){ *pLe
1a2e0 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b  n = 2; return 2;
1a2f0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33   }.    if( u<=83
1a300 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  88607 ){ *pLen =
1a310 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a   3; return 3; }.
1a320 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
1a330 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  83647 ){ *pLen =
1a340 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a   4; return 4; }.
1a350 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
1a360 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  BYTE ){ *pLen = 
1a370 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20  6; return 5; }. 
1a380 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
1a390 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
1a3a0 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
1a3b0 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Real ){.    *pLe
1a3c0 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
1a3d0 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
1a3e0 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
1a3f0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
1a400 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
1a410 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
1a420 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
1a430 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d  .  n = (u32)pMem
1a440 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
1a450 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1a460 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
1a470 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c  nZero;.  }.  *pL
1a480 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  en = n;.  return
1a490 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
1a4a0 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
1a4b0 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =0));.}../*.** T
1a4c0 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72  he sizes for ser
1a4d0 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74  ial types less t
1a4e0 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69  han 128.*/.stati
1a4f0 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74  c const u8 sqlit
1a500 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
1a510 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
1a520 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33  *  0   1   2   3
1a530 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37     4   5   6   7
1a540 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f     8   9 */   ./
1a550 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31  *   0 */   0,  1
1a560 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36  ,  2,  3,  4,  6
1a570 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30  ,  8,  8,  0,  0
1a580 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c  ,./*  10 */   0,
1a590 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c    0,  0,  0,  1,
1a5a0 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c    1,  2,  2,  3,
1a5b0 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20    3,./*  20 */  
1a5c0 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20   4,  4,  5,  5, 
1a5d0 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20   6,  6,  7,  7, 
1a5e0 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a   8,  8,./*  30 *
1a5f0 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31  /   9,  9, 10, 1
1a600 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31  0, 11, 11, 12, 1
1a610 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34  2, 13, 13,./*  4
1a620 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35  0 */  14, 14, 15
1a630 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37  , 15, 16, 16, 17
1a640 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a  , 17, 18, 18,./*
1a650 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c    50 */  19, 19,
1a660 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c   20, 20, 21, 21,
1a670 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c   22, 22, 23, 23,
1a680 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20  ./*  60 */  24, 
1a690 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20  24, 25, 25, 26, 
1a6a0 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20  26, 27, 27, 28, 
1a6b0 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32  28,./*  70 */  2
1a6c0 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33  9, 29, 30, 30, 3
1a6d0 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33  1, 31, 32, 32, 3
1a6e0 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f  3, 33,./*  80 */
1a6f0 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35    34, 34, 35, 35
1a700 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37  , 36, 36, 37, 37
1a710 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30  , 38, 38,./*  90
1a720 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c   */  39, 39, 40,
1a730 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c   40, 41, 41, 42,
1a740 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20   42, 43, 43,./* 
1a750 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20  100 */  44, 44, 
1a760 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20  45, 45, 46, 46, 
1a770 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a  47, 47, 48, 48,.
1a780 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34  /* 110 */  49, 4
1a790 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35  9, 50, 50, 51, 5
1a7a0 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35  1, 52, 52, 53, 5
1a7b0 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34  3,./* 120 */  54
1a7c0 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36  , 54, 55, 55, 56
1a7d0 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a  , 56, 57, 57.};.
1a7e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a7f0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
1a800 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
1a810 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
1a820 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
1a830 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
1a840 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1a850 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
1a860 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
1a870 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20  ype>=128 ){.    
1a880 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
1a890 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
1a8a0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1a8b0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a  serial_type<12 .
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
1a8d0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
1a8e0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
1a8f0 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ]==(serial_type 
1a900 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72  - 12)/2 );.    r
1a910 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
1a920 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1a930 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
1a940 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e  u8 sqlite3VdbeOn
1a950 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c  eByteSerialTypeL
1a960 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70  en(u8 serial_typ
1a970 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65  e){.  assert( se
1a980 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b  rial_type<128 );
1a990 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1a9a0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
1a9b0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a  serial_type];  .
1a9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
1a9d0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
1a9e0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
1a9f0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
1aa00 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
1aa10 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
1aa20 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
1aa30 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
1aa40 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
1aa50 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
1aa60 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
1aa70 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
1aa80 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
1aa90 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
1aaa0 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
1aab0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
1aac0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
1aad0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
1aae0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
1aaf0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
1ab00 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
1ab10 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
1ab20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
1ab30 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
1ab40 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
1ab50 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
1ab60 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
1ab70 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
1ab80 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
1ab90 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
1aba0 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
1abb0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
1abc0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
1abd0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
1abe0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
1abf0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
1ac00 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
1ac10 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
1ac20 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
1ac30 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
1ac40 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
1ac50 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
1ac60 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
1ac70 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
1ac80 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
1ac90 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
1aca0 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
1acb0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
1acc0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
1acd0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
1ace0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
1acf0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
1ad00 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
1ad10 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
1ad20 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
1ad30 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
1ad40 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
1ad50 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
1ad60 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
1ad70 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
1ad80 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
1ad90 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
1ada0 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
1adb0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
1adc0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
1add0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
1ade0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
1adf0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
1ae00 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
1ae10 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
1ae20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
1ae30 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
1ae40 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
1ae50 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
1ae60 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
1ae70 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
1ae80 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
1ae90 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
1aea0 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
1aeb0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
1aec0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
1aed0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
1aee0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
1aef0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
1af00 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
1af10 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
1af20 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
1af30 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
1af40 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
1af50 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
1af60 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
1af70 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
1af80 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
1af90 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
1afa0 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
1afb0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
1afc0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
1afd0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
1afe0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
1aff0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
1b000 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
1b010 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
1b020 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
1b030 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
1b040 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
1b050 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
1b060 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
1b070 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
1b080 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
1b090 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
1b0a0 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
1b0b0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
1b0c0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
1b0d0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
1b0e0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
1b0f0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
1b100 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
1b110 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
1b120 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1b130 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
1b140 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
1b150 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
1b160 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
1b170 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
1b180 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
1b190 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
1b1a0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
1b1b0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
1b1c0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
1b1d0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1b1e0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
1b1f0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1b200 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1b210 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1b220 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
1b230 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
1b240 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
1b250 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
1b260 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1b270 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
1b280 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
1b290 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
1b2a0 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
1b2b0 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
1b2c0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
1b2d0 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
1b2e0 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
1b2f0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
1b300 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1b310 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
1b320 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
1b330 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
1b340 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
1b350 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
1b360 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
1b370 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
1b380 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
1b390 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
1b3a0 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
1b3b0 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
1b3c0 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
1b3d0 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
1b3e0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1b3f0 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
1b400 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
1b410 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
1b420 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
1b430 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
1b440 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
1b450 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
1b460 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1b470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1b480 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
1b490 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20  (pMem->u.r) );. 
1b4a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
1b4b0 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65  &pMem->u.r, size
1b4c0 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
1b4d0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1b4e0 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
1b4f0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
1b500 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
1b510 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
1b520 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
1b530 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
1b540 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
1b550 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
1b560 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
1b570 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
1b580 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
1b590 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
1b5a0 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
1b5b0 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
1b5c0 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
1b5d0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
1b5e0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
1b5f0 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
1b600 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
1b610 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
1b620 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
1b630 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
1b640 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1b650 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
1b660 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
1b670 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20      if( len>0 ) 
1b680 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
1b690 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72  ->z, len);.    r
1b6a0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
1b6b0 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
1b6c0 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
1b6d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1b6e0 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20  /* Input "x" is 
1b6f0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e  a sequence of un
1b700 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
1b710 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  s that represent
1b720 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e   a.** big-endian
1b730 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72   integer.  Retur
1b740 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
1b750 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
1b760 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42  */.#define ONE_B
1b770 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28  YTE_INT(x)    ((
1b780 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69  i8)(x)[0]).#defi
1b790 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  ne TWO_BYTE_INT(
1b7a0 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28  x)    (256*(i8)(
1b7b0 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a  (x)[0])|(x)[1]).
1b7c0 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59  #define THREE_BY
1b7d0 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33  TE_INT(x)  (6553
1b7e0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
1b7f0 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32  (x)[1]<<8)|(x)[2
1b800 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
1b810 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28  BYTE_UINT(x)  ((
1b820 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29  (u32)(x)[0]<<24)
1b830 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
1b840 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
1b850 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
1b860 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37  YTE_INT(x) (1677
1b870 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  7216*(i8)((x)[0]
1b880 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
1b890 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
1b8a0 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  ])../*.** Deseri
1b8b0 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
1b8c0 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
1b8d0 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
1b8e0 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
1b8f0 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
1b900 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
1b910 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
1b920 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
1b930 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ad..**.** This f
1b940 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
1b950 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65  mented as two se
1b960 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20  parate routines 
1b970 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  for performance.
1b980 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65  .** The few case
1b990 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c  s that require l
1b9a0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  ocal variables a
1b9b0 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  re broken out in
1b9c0 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a  to a separate.**
1b9d0 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
1b9e0 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74   in most cases t
1b9f0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d  he overhead of m
1ba00 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20  oving the stack 
1ba10 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76  pointer.** is av
1ba20 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  oided..*/ .stati
1ba30 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49  c u32 SQLITE_NOI
1ba40 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28  NLINE serialGet(
1ba50 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1ba60 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
1ba70 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
1ba80 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
1ba90 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
1baa0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1bab0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1bac0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1bad0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
1bb00 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
1bb10 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36   into */.){.  u6
1bb20 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1bb30 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32  UINT(buf);.  u32
1bb40 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1bb50 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20  INT(buf+4);.  x 
1bb60 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20  = (x<<32) + y;. 
1bb70 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1bb80 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ==6 ){.    /* EV
1bb90 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38  IDENCE-OF: R-298
1bba0 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69  51-52272 Value i
1bbb0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36  s a big-endian 6
1bbc0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f  4-bit.    ** two
1bbd0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1bbe0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65  eger. */.    pMe
1bbf0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
1bc00 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  &x;.    pMem->fl
1bc10 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1bc20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1bc30 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65  m->u.i<0 );.  }e
1bc40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
1bc50 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33  ENCE-OF: R-57343
1bc60 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20  -49114 Value is 
1bc70 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45  a big-endian IEE
1bc80 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69  E 754-2008 64-bi
1bc90 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e  t.    ** floatin
1bca0 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20  g point number. 
1bcb0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1bcc0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
1bcd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bce0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
1bcf0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
1bd00 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
1bd10 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
1bd20 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
1bd30 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  me.    ** byte o
1bd40 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
1bd50 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
1bd60 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
1bd70 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66  AT is.    ** def
1bd80 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
1bd90 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1bda0 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
1bdb0 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65  e mixed.    ** e
1bdc0 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndian..    */.  
1bdd0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1bde0 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
1bdf0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
1be00 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1be10 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
1be20 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31  .    u64 t2 = t1
1be30 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
1be40 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
1be50 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1be60 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
1be70 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
1be80 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
1be90 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
1bea0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1beb0 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
1bec0 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38  of(pMem->u.r)==8
1bed0 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65   );.    swapMixe
1bee0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
1bef0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65  .    memcpy(&pMe
1bf00 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65  m->u.r, &x, size
1bf10 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d  of(x));.    pMem
1bf20 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
1bf30 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72  3IsNaN(pMem->u.r
1bf40 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
1bf50 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72  EM_Real;.  }.  r
1bf60 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73  eturn 8;.}.u32 s
1bf70 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1bf80 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
1bf90 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
1bfa0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
1bfb0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
1bfc0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
1bfd0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
1bfe0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1bff0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
1c000 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
1c010 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
1c020 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
1c030 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
1c040 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
1c050 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1c060 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1c070 65 20 31 30 3a 20 7b 20 2f 2a 20 49 6e 74 65 72  e 10: { /* Inter
1c080 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 3a 20 4e 55  nal use only: NU
1c090 4c 4c 20 77 69 74 68 20 76 69 72 74 75 61 6c 20  LL with virtual 
1c0a0 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
1c0b0 20 20 20 20 20 2a 2a 20 55 50 44 41 54 45 20 6e       ** UPDATE n
1c0c0 6f 2d 63 68 61 6e 67 65 20 66 6c 61 67 20 73 65  o-change flag se
1c0d0 74 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  t */.      pMem-
1c0e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
1c0f0 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 20 20  l|MEM_Zero;.    
1c100 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20    pMem->n = 0;. 
1c110 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65       pMem->u.nZe
1c120 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ro = 0;.      br
1c130 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c140 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
1c150 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1c160 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
1c170 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a   0: {  /* Null *
1c180 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1c190 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d  NCE-OF: R-24078-
1c1a0 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61  09375 Value is a
1c1b0 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20   NULL. */.      
1c1c0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1c1d0 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
1c1e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c1f0 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f  ase 1: {.      /
1c200 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c210 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c  -44885-25196 Val
1c220 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74  ue is an 8-bit t
1c230 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20  wos-complement. 
1c240 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
1c250 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1c260 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  u.i = ONE_BYTE_I
1c270 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1c280 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1c290 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1c2a0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1c2b0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1c2c0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
1c2d0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
1c2e0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c2f0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1c300 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37  IDENCE-OF: R-497
1c310 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69  94-35026 Value i
1c320 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31  s a big-endian 1
1c330 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  6-bit.      ** t
1c340 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1c350 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1c360 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f   pMem->u.i = TWO
1c370 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1c380 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1c390 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1c3a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1c3b0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1c3c0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
1c3d0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
1c3e0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
1c3f0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1c400 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1c410 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20  : R-37839-54301 
1c420 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1c430 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20  ndian 24-bit.   
1c440 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1c450 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1c460 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1c470 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  i = THREE_BYTE_I
1c480 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1c490 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1c4a0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1c4b0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1c4c0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1c4d0 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
1c4e0 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
1c4f0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c500 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1c510 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38  IDENCE-OF: R-018
1c520 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69  49-26079 Value i
1c530 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33  s a big-endian 3
1c540 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  2-bit.      ** t
1c550 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1c560 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1c570 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
1c580 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  R_BYTE_INT(buf);
1c590 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20  .#ifdef __HP_cc 
1c5a0 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61  .      /* Work a
1c5b0 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74  round a sign-ext
1c5c0 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68  ension bug in th
1c5d0 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f  e HP compiler fo
1c5e0 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20  r HP/UX */.     
1c5f0 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30   if( buf[0]&0x80
1c600 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20   ) pMem->u.i |= 
1c610 30 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30  0xffffffff800000
1c620 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  00LL;.#endif.   
1c630 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1c640 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1c650 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1c660 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1c670 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
1c680 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
1c690 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
1c6a0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1c6b0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c6c0 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c  -50385-09674 Val
1c6d0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1c6e0 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20  an 48-bit.      
1c6f0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1c700 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1c710 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1c720 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1c730 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29  buf+2) + (((i64)
1c740 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1c750 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1c760 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1c770 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1c780 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1c790 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1c7a0 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
1c7b0 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
1c7c0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1c7d0 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
1c7e0 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
1c7f0 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
1c800 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73       /* These us
1c810 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
1c820 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e  s, so do them in
1c830 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74   a separate rout
1c840 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ine.      ** to 
1c850 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20  avoid having to 
1c860 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70  move the frame p
1c870 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f  ointer in the co
1c880 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
1c890 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c     return serial
1c8a0 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74  Get(buf,serial_t
1c8b0 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ype,pMem);.    }
1c8c0 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
1c8d0 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
1c8e0 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
1c8f0 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
1c900 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1c910 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38  -OF: R-12976-228
1c920 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  93 Value is the 
1c930 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20  integer 0. */.  
1c940 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c950 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32  OF: R-18143-1212
1c960 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  1 Value is the i
1c970 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20  nteger 1. */.   
1c980 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
1c990 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
1c9a0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1c9b0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1c9c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1c9d0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1c9e0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1c9f0 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31  E-OF: R-14606-31
1ca00 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42  564 Value is a B
1ca10 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31  LOB that is (N-1
1ca20 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20  2)/2 bytes in.  
1ca30 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20      ** length.. 
1ca40 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
1ca50 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31  -OF: R-28401-001
1ca60 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74  40 Value is a st
1ca70 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74  ring in the text
1ca80 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20   encoding and.  
1ca90 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20      ** (N-13)/2 
1caa0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
1cab0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
1cac0 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67   const u16 aFlag
1cad0 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c  [] = { MEM_Blob|
1cae0 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53  MEM_Ephem, MEM_S
1caf0 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a  tr|MEM_Ephem };.
1cb00 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
1cb10 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
1cb20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65     pMem->n = (se
1cb30 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
1cb40 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1cb50 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61  gs = aFlag[seria
1cb60 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20  l_type&1];.     
1cb70 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b   return pMem->n;
1cb80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1cb90 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54  urn 0;.}./*.** T
1cba0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1cbb0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
1cbc0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1cbd0 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64   for an Unpacked
1cbe0 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
1cbf0 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ure large enough
1cc00 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
1cc10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1cc20 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a  rdUnpack() if.**
1cc30 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1cc40 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
1cc50 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75   to KeyInfo stru
1cc60 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a  cture pKeyInfo..
1cc70 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20  **.** The space 
1cc80 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61  is either alloca
1cc90 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
1cca0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f  3DbMallocRaw() o
1ccb0 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a  r from within.**
1ccc0 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62   the unaligned b
1ccd0 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61  uffer passed via
1cce0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   the second and 
1ccf0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20  third arguments 
1cd00 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73  (presumably.** s
1cd10 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20  tack space). If 
1cd20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
1cd30 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1cd40 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61  to a pointer tha
1cd50 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65  t should.** be e
1cd60 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
1cd70 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
1cd80 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1cd90 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  e(). Or, if the 
1cda0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  .** allocation c
1cdb0 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53  omes from the pS
1cdc0 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66  pace/szSpace buf
1cdd0 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20  fer, *ppFree is 
1cde0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62  set to NULL.** b
1cdf0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1ce00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
1ce10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
1ce20 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
1ce30 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  .*/.UnpackedReco
1ce40 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  rd *sqlite3VdbeA
1ce50 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
1ce60 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  rd(.  KeyInfo *p
1ce70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20 20  KeyInfo         
1ce80 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70        /* Descrip
1ce90 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f  tion of the reco
1cea0 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  rd */.){.  Unpac
1ceb0 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
1cec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1ced0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
1cee0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1cef0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cf10 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1cf20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
1cf30 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  */.  nByte = ROU
1cf40 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1cf50 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
1cf60 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
1cf70 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 31  nfo->nKeyField+1
1cf80 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  );.  p = (Unpack
1cf90 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74  edRecord *)sqlit
1cfa0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b  e3DbMallocRaw(pK
1cfb0 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74  eyInfo->db, nByt
1cfc0 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72  e);.  if( !p ) r
1cfd0 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d  eturn 0;.  p->aM
1cfe0 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68  em = (Mem*)&((ch
1cff0 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69  ar*)p)[ROUND8(si
1d000 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
1d010 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  ord))];.  assert
1d020 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1d030 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70  tOrder!=0 );.  p
1d040 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1d050 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
1d060 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
1d070 4b 65 79 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  KeyField + 1;.  
1d080 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1d090 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65  ** Given the nKe
1d0a0 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20  y-byte encoding 
1d0b0 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70  of a record in p
1d0c0 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20  Key[], populate 
1d0d0 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64  the .** Unpacked
1d0e0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
1d0f0 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
1d100 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
1d110 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  t with the.** co
1d120 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65  ntents of the de
1d130 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f  coded record..*/
1d140 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64   .void sqlite3Vd
1d150 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
1d160 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1d170 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
1d180 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1d190 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
1d1a0 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d1c0 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
1d1d0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
1d1e0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1d1f0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
1d200 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
1d210 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1d220 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
1d230 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
1d240 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1d250 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  g. */.){.  const
1d260 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d270 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
1d280 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1d290 65 79 3b 0a 20 20 75 33 32 20 64 3b 20 0a 20 20  ey;.  u32 d; .  
1d2a0 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20  u32 idx;        
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65  /* Offset in aKe
1d2d0 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  y[] to read from
1d2e0 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20   */.  u16 u;    
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1d310 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1d320 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
1d330 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
1d340 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61  aMem;..  p->defa
1d350 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73  ult_rc = 0;.  as
1d360 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1d370 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
1d380 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
1d390 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1d3a0 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
1d3b0 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
1d3c0 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
1d3d0 26 20 64 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  & d<=(u32)nKey )
1d3e0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1d3f0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
1d400 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1d410 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
1d420 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
1d430 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
1d440 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
1d450 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
1d460 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
1d470 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
1d480 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1d490 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
1d4a0 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
1d4b0 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
1d4c0 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  c = 0;.    pMem-
1d4d0 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  >z = 0;.    d +=
1d4e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1d4f0 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
1d500 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
1d510 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
1d520 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
1d530 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
1d540 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 3e 28 75  ;.  }.  if( d>(u
1d550 33 32 29 6e 4b 65 79 20 26 26 20 75 20 29 7b 0a  32)nKey && u ){.
1d560 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
1d570 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 2f 2a  UPT_DB );.    /*
1d580 20 49 6e 20 61 20 63 6f 72 72 75 70 74 20 72 65   In a corrupt re
1d590 63 6f 72 64 20 65 6e 74 72 79 2c 20 74 68 65 20  cord entry, the 
1d5a0 6c 61 73 74 20 70 4d 65 6d 20 6d 69 67 68 74 20  last pMem might 
1d5b0 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 75 70  have been set up
1d5c0 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 75   using .    ** u
1d5d0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 6d 65 6d  ninitialized mem
1d5e0 6f 72 79 2e 20 4f 76 65 72 77 72 69 74 65 20 69  ory. Overwrite i
1d5f0 74 73 20 76 61 6c 75 65 20 77 69 74 68 20 4e 55  ts value with NU
1d600 4c 4c 2c 20 74 6f 20 70 72 65 76 65 6e 74 0a 20  LL, to prevent. 
1d610 20 20 20 2a 2a 20 77 61 72 6e 69 6e 67 73 20 66     ** warnings f
1d620 72 6f 6d 20 4d 53 41 4e 2e 20 2a 2f 0a 20 20 20  rom MSAN. */.   
1d630 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1d640 65 74 4e 75 6c 6c 28 70 4d 65 6d 2d 31 29 3b 0a  etNull(pMem-1);.
1d650 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c    }.  assert( u<
1d660 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  =pKeyInfo->nKeyF
1d670 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
1d680 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
1d690 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1d6a0 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
1d6b0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1d6c0 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
1d6d0 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
1d6e0 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
1d6f0 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
1d700 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1d710 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
1d720 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
1d730 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
1d740 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1d750 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
1d760 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
1d770 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
1d780 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1d790 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
1d7a0 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
1d7b0 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
1d7c0 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
1d7d0 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
1d7e0 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
1d7f0 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
1d800 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1d810 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
1d820 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
1d830 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
1d840 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
1d850 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
1d860 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1d870 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
1d880 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
1d890 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
1d8a0 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
1d8b0 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
1d8c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1d8d0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1d8e0 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
1d8f0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1d900 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1d910 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
1d920 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1d930 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
1d940 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1d950 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
1d960 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
1d970 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
1d980 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1d990 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1d9a0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1d9b0 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1d9c0 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1d9d0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1d9e0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1d9f0 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
1da00 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
1da10 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
1da20 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1da30 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1da40 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
1da50 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
1da60 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1da70 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1da80 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1da90 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1daa0 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
1dab0 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
1dac0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1dad0 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
1dae0 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
1daf0 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
1db00 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1db10 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
1db20 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
1db30 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
1db40 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
1db50 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
1db60 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1db70 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
1db80 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1db90 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1dba0 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1dbb0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
1dbc0 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
1dbd0 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
1dbe0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
1dbf0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
1dc00 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
1dc10 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
1dc20 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
1dc30 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
1dc40 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
1dc50 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
1dc60 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
1dc70 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
1dc80 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1dc90 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1dca0 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1dcb0 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1dcc0 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1dcd0 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1dce0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1dcf0 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1dd00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1dd10 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1dd20 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1dd30 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1dd40 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1dd50 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1dd60 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1dd70 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1dd80 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1dd90 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1dda0 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1ddb0 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1ddc0 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1ddd0 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1dde0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1ddf0 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1de00 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1de10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1de20 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1de30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1de40 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e  Info->nAllField>
1de50 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
1de60 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1de70 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1de80 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1de90 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1dea0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1deb0 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
1dec0 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
1ded0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1dee0 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
1def0 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
1df00 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
1df10 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
1df20 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
1df30 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
1df40 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
1df50 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
1df60 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
1df70 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
1df80 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
1df90 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
1dfa0 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
1dfb0 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
1dfc0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
1dfd0 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
1dfe0 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
1dff0 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
1e000 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
1e010 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1e020 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
1e030 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
1e040 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
1e050 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
1e060 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
1e070 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
1e080 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
1e090 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e0a0 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
1e0b0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
1e0c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
1e0d0 31 2b 28 75 36 34 29 73 65 72 69 61 6c 5f 74 79  1+(u64)serial_ty
1e0e0 70 65 31 2b 32 3e 28 75 36 34 29 6e 4b 65 79 31  pe1+2>(u64)nKey1
1e0f0 0a 20 20 20 20 20 26 26 20 64 31 2b 28 75 36 34  .     && d1+(u64
1e100 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
1e110 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1e120 5f 74 79 70 65 31 29 3e 28 75 36 34 29 6e 4b 65  _type1)>(u64)nKe
1e130 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  y1 .    ){.     
1e140 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1e150 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1e160 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
1e170 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
1e180 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
1e190 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1e1a0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1e1b0 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
1e1c0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
1e1d0 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
1e1e0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1e1f0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
1e200 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
1e210 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  m[i],.          
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1e240 69 65 6c 64 3e 69 20 3f 20 70 4b 65 79 49 6e 66  ield>i ? pKeyInf
1e250 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
1e260 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
1e270 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1e280 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1e290 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1e2a0 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1e2b0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1e2c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1e2d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e2e0 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
1e2f0 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
1e300 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
1e310 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1e320 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
1e330 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
1e340 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
1e350 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
1e360 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1e370 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1e380 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1e390 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1e3a0 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1e3b0 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1e3c0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1e3d0 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1e3e0 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1e3f0 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1e400 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1e410 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1e420 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e430 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
1e440 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1e450 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1e460 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1e470 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1e480 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1e490 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1e4a0 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1e4b0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1e4c0 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1e4d0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1e4e0 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1e4f0 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
1e500 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1e510 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
1e520 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
1e530 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
1e540 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
1e550 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1e560 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
1e570 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1e580 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
1e590 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
1e5a0 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
1e5b0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
1e5c0 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1e5d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1e5e0 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1e5f0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1e600 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1e610 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  TE_DEBUG./*.** C
1e620 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1e630 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61  of fields (a.k.a
1e640 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68  . columns) in th
1e650 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62  e record given b
1e660 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  y.** pKey,nKey. 
1e670 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74   The verify that
1e680 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c   this count is l
1e690 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1e6a0 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69  l to the.** limi
1e6b0 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49  t given by pKeyI
1e6c0 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a  nfo->nAllField..
1e6d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f  **.** If this co
1e6e0 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20  nstraint is not 
1e6f0 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65  satisfied, it me
1e700 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69 67  ans that the hig
1e710 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52  h-speed.** vdbeR
1e720 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1e730 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64  ) and vdbeRecord
1e740 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
1e750 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a  routines will.**
1e760 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
1e770 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61 73  tly.  If this as
1e780 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72 65  sert() ever fire
1e790 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d  s, it probably m
1e7a0 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  eans.** that the
1e7b0 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46 69 65   KeyInfo.nKeyFie
1e7c0 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 41  ld or KeyInfo.nA
1e7d0 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77  llField values w
1e7e0 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20  ere computed.** 
1e7f0 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  incorrectly..*/.
1e800 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
1e810 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1e820 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20  WithinLimits(.  
1e830 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20  int nKey, const 
1e840 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1e850 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76   The record to v
1e860 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73  erify */ .  cons
1e870 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1e880 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  nfo       /* Com
1e890 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74  pare size with t
1e8a0 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29  his KeyInfo */.)
1e8b0 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d  {.  int nField =
1e8c0 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   0;.  u32 szHdr;
1e8d0 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33  .  u32 idx;.  u3
1e8e0 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e  2 notUsed;.  con
1e8f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1e900 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1e910 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1e920 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52  Key;..  if( CORR
1e930 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
1e940 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
1e950 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
1e960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65  );.  assert( nKe
1e970 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
1e980 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b  ( szHdr<=(u32)nK
1e990 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ey );.  while( i
1e9a0 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20  dx<szHdr ){.    
1e9b0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1e9c0 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74  32(aKey+idx, not
1e9d0 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c  Used);.    nFiel
1e9e0 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  d++;.  }.  asser
1e9f0 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65  t( nField <= pKe
1ea00 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1ea10 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
1ea20 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46  fine vdbeAssertF
1ea30 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1ea40 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e  imits(A,B,C).#en
1ea50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
1ea60 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
1ea70 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
1ea80 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
1ea90 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
1eaa0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
1eab0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1eac0 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
1ead0 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
1eae0 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
1eaf0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
1eb00 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
1eb10 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1eb20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1eb30 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
1eb40 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
1eb50 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
1eb60 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
1eb70 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
1eb80 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
1eb90 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1eba0 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1ebb0 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
1ebc0 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
1ebd0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a  CollSeq *pColl,.
1ebe0 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20    u8 *prcErr    
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f    /* If an OOM o
1ec10 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51  ccurs, set to SQ
1ec20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b  LITE_NOMEM */.){
1ec30 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
1ec40 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
1ec50 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
1ec60 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
1ec70 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
1ec80 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
1ec90 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
1eca0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
1ecb0 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
1ecc0 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
1ecd0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
1ece0 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
1ecf0 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
1ed00 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
1ed10 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
1ed20 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
1ed30 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
1ed40 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73     Mem c2;.    s
1ed50 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1ed60 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c1, pMem1->db
1ed70 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1ed80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1ed90 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e  nit(&c2, pMem1->
1eda0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1edb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1edc0 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
1edd0 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
1ede0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
1edf0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1ee00 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
1ee10 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
1ee20 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
1ee30 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1ee40 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
1ee50 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32 20 3d 20  >enc);.    v2 = 
1ee60 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1ee70 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1ee80 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c2, pColl->enc
1ee90 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d  );.    if( (v1==
1eea0 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b 0a 20  0 || v2==0) ){. 
1eeb0 20 20 20 20 20 69 66 28 20 70 72 63 45 72 72 20       if( prcErr 
1eec0 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49  ) *prcErr = SQLI
1eed0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1eee0 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
1eef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1ef00 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
1ef10 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63 31 2e  Coll->pUser, c1.
1ef20 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76 32 29  n, v1, c2.n, v2)
1ef30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1ef40 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1ef50 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69  e(&c1);.    sqli
1ef60 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1ef70 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75  e(&c2);.    retu
1ef80 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
1ef90 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70 42  .** The input pB
1efa0 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74 65 65  lob is guarantee
1efb0 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62 20 74  d to be a Blob t
1efc0 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65  hat is not marke
1efd0 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65  d.** with MEM_Ze
1efe0 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ro.  Return true
1eff0 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62 65 20   if it could be 
1f000 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a  a zero-blob..*/.
1f010 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 6c 6c  static int isAll
1f020 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61 72 20  Zero(const char 
1f030 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
1f040 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1f050 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1f060 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e  f( z[i] ) return
1f070 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1f080 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
1f090 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20  pare two blobs. 
1f0a0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1f0b0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1f0c0 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1f0d0 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
1f0e0 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1f0f0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1f100 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69  second, respecti
1f110 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20  vely..** If one 
1f120 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78  blob is a prefix
1f130 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74   of the other, t
1f140 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20  hen the shorter 
1f150 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a  is the lessor..*
1f160 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  /.SQLITE_NOINLIN
1f170 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f  E int sqlite3Blo
1f180 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  bCompare(const M
1f190 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d  em *pB1, const M
1f1a0 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20  em *pB2){.  int 
1f1b0 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 70 42  c;.  int n1 = pB
1f1c0 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32 20 3d  1->n;.  int n2 =
1f1d0 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49   pB2->n;..  /* I
1f1e0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1f1f0 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76 61 6c   have a Blob val
1f200 75 65 20 74 68 61 74 20 68 61 73 20 73 6f 6d 65  ue that has some
1f210 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e   non-zero conten
1f220 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  t.  ** followed 
1f230 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 2e  by zero content.
1f240 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c 79 20    But that only 
1f250 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42 6c 6f  comes up for Blo
1f260 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 62  bs formed.  ** b
1f270 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
1f280 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20  ord opcode, and 
1f290 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76 65 72  such Blobs never
1f2a0 20 67 65 74 20 70 61 73 73 65 64 20 69 6e 74 6f   get passed into
1f2b0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d  .  ** sqlite3Mem
1f2c0 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a 20 20  Compare(). */.  
1f2d0 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e 66 6c  assert( (pB1->fl
1f2e0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
1f2f0 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20  =0 || n1==0 );. 
1f300 20 61 73 73 65 72 74 28 20 28 70 42 32 2d 3e 66   assert( (pB2->f
1f310 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1f320 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a  ==0 || n2==0 );.
1f330 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66 6c 61  .  if( (pB1->fla
1f340 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29 20 26  gs|pB2->flags) &
1f350 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1f360 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20   if( pB1->flags 
1f370 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d  & pB2->flags & M
1f380 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
1f390 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e   return pB1->u.n
1f3a0 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a  Zero - pB2->u.nZ
1f3b0 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ero;.    }else i
1f3c0 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20  f( pB1->flags & 
1f3d0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
1f3e0 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
1f3f0 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29  (pB2->z, pB2->n)
1f400 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1f410 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e      return pB1->
1f420 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20 20  u.nZero - n2;.  
1f430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1f440 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42  f( !isAllZero(pB
1f450 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20 29 20  1->z, pB1->n) ) 
1f460 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1f470 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70 42 32   return n1 - pB2
1f480 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d  ->u.nZero;.    }
1f490 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d 63 6d  .  }.  c = memcm
1f4a0 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a  p(pB1->z, pB2->z
1f4b0 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e  , n1>n2 ? n2 : n
1f4c0 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65  1);.  if( c ) re
1f4d0 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e  turn c;.  return
1f4e0 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a   n1 - n2;.}../*.
1f4f0 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73  ** Do a comparis
1f500 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d  on between a 64-
1f510 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1f520 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20  er and a 64-bit 
1f530 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a  floating-point.*
1f540 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  * number.  Retur
1f550 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1f560 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1f570 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34 29   the first (i64)
1f580 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a   is less than,.*
1f590 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  * equal to, or g
1f5a0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1f5b0 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e  second (double).
1f5c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1f5d0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1f5e0 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75  mpare(i64 i, dou
1f5f0 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69  ble r){.  if( si
1f600 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  zeof(LONGDOUBLE_
1f610 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c  TYPE)>8 ){.    L
1f620 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78  ONGDOUBLE_TYPE x
1f630 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54   = (LONGDOUBLE_T
1f640 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78  YPE)i;.    if( x
1f650 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1f660 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72 65      if( x>r ) re
1f670 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1f680 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1f690 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64      i64 y;.    d
1f6a0 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28  ouble s;.    if(
1f6b0 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35   r<-922337203685
1f6c0 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75  4775808.0 ) retu
1f6d0 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72  rn +1;.    if( r
1f6e0 3e 3d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  >=92233720368547
1f6f0 37 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e  75808.0 ) return
1f700 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36   -1;.    y = (i6
1f710 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79  4)r;.    if( i<y
1f720 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1f730 20 20 69 66 28 20 69 3e 79 20 29 20 72 65 74 75    if( i>y ) retu
1f740 72 6e 20 2b 31 3b 0a 20 20 20 20 73 20 3d 20 28  rn +1;.    s = (
1f750 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66  double)i;.    if
1f760 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( s<r ) return -
1f770 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29  1;.    if( s>r )
1f780 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1f790 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
1f7a0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1f7b0 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  he values contai
1f7c0 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d  ned by the two m
1f7d0 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74  emory cells, ret
1f7e0 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69  urning.** negati
1f7f0 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69  ve, zero or posi
1f800 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73  tive if pMem1 is
1f810 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1f820 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1f830 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20  .** than pMem2. 
1f840 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73  Sorting order is
1f850 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66   NULL's first, f
1f860 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65  ollowed by numbe
1f870 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20  rs (integers.** 
1f880 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65  and reals) sorte
1f890 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66  d numerically, f
1f8a0 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20  ollowed by text 
1f8b0 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63  ordered by the c
1f8c0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
1f8d0 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66  ence pColl and f
1f8e0 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72  inally blob's or
1f8f0 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28  dered by memcmp(
1f900 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  )..**.** Two NUL
1f910 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  L values are con
1f920 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79  sidered equal by
1f930 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1f940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
1f950 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  mCompare(const M
1f960 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74  em *pMem1, const
1f970 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e   Mem *pMem2, con
1f980 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1f990 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32  l){.  int f1, f2
1f9a0 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64  ;.  int combined
1f9b0 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20  _flags;..  f1 = 
1f9c0 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem1->flags;.  
1f9d0 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67  f2 = pMem2->flag
1f9e0 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c  s;.  combined_fl
1f9f0 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61  ags = f1|f2;.  a
1fa00 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 56  ssert( !sqlite3V
1fa10 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70  dbeMemIsRowSet(p
1fa20 4d 65 6d 31 29 20 26 26 20 21 73 71 6c 69 74 65  Mem1) && !sqlite
1fa30 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74  3VdbeMemIsRowSet
1fa40 28 70 4d 65 6d 32 29 20 29 3b 0a 20 0a 20 20 2f  (pMem2) );. .  /
1fa50 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1fa60 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65  s NULL, it is le
1fa70 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65  ss than the othe
1fa80 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  r. If both value
1fa90 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c  s.  ** are NULL,
1faa0 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
1fab0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1fac0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
1fad0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26  .    return (f2&
1fae0 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26  MEM_Null) - (f1&
1faf0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a  MEM_Null);.  }..
1fb00 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e    /* At least on
1fb10 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c  e of the two val
1fb20 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a  ues is a number.
1fb30 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1fb40 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
1fb50 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
1fb60 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1fb70 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1fb80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1fb90 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
1fba0 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
1fbb0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1fbc0 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.i > pMem2->u
1fbd0 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .i ) return +1;.
1fbe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1fbf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1fc00 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61  1 & f2 & MEM_Rea
1fc10 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1fc20 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20  f( pMem1->u.r < 
1fc30 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1fc40 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1fc50 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70  ( pMem1->u.r > p
1fc60 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1fc70 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1fc80 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1fc90 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
1fca0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1fcb0 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
1fcc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1fcd0 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46  turn sqlite3IntF
1fce0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1fcf0 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75  1->u.i, pMem2->u
1fd00 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1fd10 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fd20 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1fd30 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1fd40 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1fd50 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1fd60 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1fd70 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69      return -sqli
1fd80 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1fd90 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70  re(pMem2->u.i, p
1fda0 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem1->u.r);.    
1fdb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fdc0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1fdd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1fde0 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20  turn +1;.  }..  
1fdf0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1fe00 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
1fe10 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
1fe20 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
1fe30 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1fe40 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
1fe50 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
1fe60 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
1fe70 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
1fe80 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1fe90 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
1fea0 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
1feb0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1fec0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1fed0 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
1fee0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1fef0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1ff00 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1ff10 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
1ff20 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65  Mem2->enc || pMe
1ff30 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  m1->db->mallocFa
1ff40 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
1ff50 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1ff60 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a  SQLITE_UTF8 || .
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d              pMem
1ff80 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1ff90 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d  TF16LE || pMem1-
1ffa0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1ffb0 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  16BE );..    /* 
1ffc0 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
1ffd0 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64  quence must be d
1ffe0 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70  efined at this p
1fff0 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20  oint, even if.  
20000 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65    ** the user de
20010 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  letes the collat
20020 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74  ion sequence aft
20030 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  er the vdbe prog
20040 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  ram is.    ** co
20050 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73  mpiled (this was
20060 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20   not always the 
20070 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  case)..    */.  
20080 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c    assert( !pColl
20090 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   || pColl->xCmp 
200a0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  );..    if( pCol
200b0 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  l ){.      retur
200c0 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  n vdbeCompareMem
200d0 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d  String(pMem1, pM
200e0 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a  em2, pColl, 0);.
200f0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
20100 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77  a NULL pointer w
20110 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  as passed as the
20120 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f   collate functio
20130 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  n, fall through.
20140 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c      ** to the bl
20150 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20  ob case and use 
20160 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
20170 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61  }. .  /* Both va
20180 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f  lues must be blo
20190 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69  bs.  Compare usi
201a0 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  ng memcmp().  */
201b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
201c0 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65  3BlobCompare(pMe
201d0 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a  m1, pMem2);.}...
201e0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
201f0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
20200 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
20210 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70   is a serial-typ
20220 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73  e that.** corres
20230 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65  ponds to an inte
20240 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73  ger - all values
20250 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39   between 1 and 9
20260 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65   inclusive .** e
20270 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63  xcept 7. The sec
20280 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ond points to a 
20290 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
202a0 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  g an integer val
202b0 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64  ue.** serialized
202c0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65   according to se
202d0 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20  rial_type. This 
202e0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
202f0 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74  lizes.** and ret
20300 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a  urns the value..
20310 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64  */.static i64 vd
20320 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
20330 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  t(u32 serial_typ
20340 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  e, const u8 *aKe
20350 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61  y){.  u32 y;.  a
20360 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
20370 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  B || (serial_typ
20380 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74  e>=1 && serial_t
20390 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c  ype<=9 && serial
203a0 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73  _type!=7) );.  s
203b0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
203c0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30  pe ){.    case 0
203d0 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20  :.    case 1:.  
203e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
203f0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
20400 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42      return ONE_B
20410 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20420 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
20430 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
20440 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
20450 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45   return TWO_BYTE
20460 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20470 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65  case 3:.      te
20480 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
20490 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
204a0 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f  turn THREE_BYTE_
204b0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
204c0 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74  ase 4: {.      t
204d0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
204e0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79  &0x80 );.      y
204f0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
20500 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72  T(aKey);.      r
20510 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74  eturn (i64)*(int
20520 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)&y;.    }.    
20530 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20  case 5: {.      
20540 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
20550 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
20560 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45  return FOUR_BYTE
20570 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
20580 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
20590 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
205a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
205b0 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34  e 6: {.      u64
205c0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
205d0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
205e0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
205f0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
20600 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
20610 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20620 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74  ey+4);.      ret
20630 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29  urn (i64)*(i64*)
20640 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  &x;.    }.  }.. 
20650 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
20660 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a  type - 8);.}../*
20670 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20680 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
20690 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
206a0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
206b0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
206c0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
206d0 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
206e0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
206f0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
20700 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
20710 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
20720 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
20730 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
20740 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
20750 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
20760 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
20770 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
20780 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
20790 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
207a0 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
207b0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
207c0 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
207d0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
207e0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
207f0 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
20800 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b   If argument bSk
20810 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
20820 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
20830 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
20840 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74  s already.** det
20850 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
20860 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
20870 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
20880 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ual..**.** Key1 
20890 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
208a0 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
208b0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
208c0 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c  of fields. If al
208d0 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61  l .** fields tha
208e0 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68  t appear in both
208f0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c   keys are equal,
20900 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65   then pPKey2->de
20910 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20  fault_rc is .** 
20920 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
20930 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  If database corr
20940 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76  uption is discov
20950 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32  ered, set pPKey2
20960 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a  ->errCode to .**
20970 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
20980 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66  and return 0. If
20990 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73   an OOM error is
209a0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a   encountered, .*
209b0 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  * pPKey2->errCod
209c0 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
209d0 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66  TE_NOMEM and, if
209e0 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
209f0 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66   the.** malloc-f
20a00 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f  ailed flag set o
20a10 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
20a20 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  e (pPKey2->pKeyI
20a30 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74  nfo->db)..*/.int
20a40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20a50 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
20a60 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  p(.  int nKey1, 
20a70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
20a80 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
20a90 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20aa0 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20  cord *pPKey2,   
20ab0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
20ac0 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  ey */.  int bSki
20ad0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
20ae0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
20af0 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72  ue, skip the fir
20b00 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  st field */.){. 
20b10 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b30 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
20b40 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
20b50 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
20b60 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
20b90 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61  t field to compa
20ba0 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  re */.  u32 szHd
20bb0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
20bc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20bd0 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  of record header
20be0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
20bf0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c10 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
20c20 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72  t type in header
20c30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   */.  int rc = 0
20c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20c60 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  value */.  Mem *
20c70 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61  pRhs = pPKey2->a
20c80 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  Mem;       /* Ne
20c90 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  xt field of pPKe
20ca0 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  y2 to compare */
20cb0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
20cc0 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Info;.  const un
20cd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
20ce0 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
20cf0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
20d00 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  1;.  Mem mem1;..
20d10 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73    /* If bSkip is
20d20 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
20d30 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
20d40 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  dy determined th
20d50 61 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  at the first.  *
20d60 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
20d70 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  n the keys are e
20d80 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61  qual. Fix the va
20d90 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69  rious stack vari
20da0 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68  ables so.  ** th
20db0 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  at this routine 
20dc0 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67  begins comparing
20dd0 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66   at the second f
20de0 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62  ield. */.  if( b
20df0 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20  Skip ){.    u32 
20e00 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31  s1;.    idx1 = 1
20e10 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26   + getVarint32(&
20e20 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20  aKey1[1], s1);. 
20e30 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79     szHdr1 = aKey
20e40 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73  1[0];.    d1 = s
20e50 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56  zHdr1 + sqlite3V
20e60 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
20e70 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b  (s1);.    i = 1;
20e80 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d  .    pRhs++;.  }
20e90 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d  else{.    idx1 =
20ea0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
20eb0 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20  y1, szHdr1);.   
20ec0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
20ed0 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69    i = 0;.  }.  i
20ee0 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
20ef0 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 70 50  nKey1 ){ .    pP
20f00 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
20f10 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
20f20 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
20f30 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
20f40 70 74 69 6f 6e 20 2a 2f 0a 20 20 7d 0a 0a 20 20  ption */.  }..  
20f50 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
20f60 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
20f70 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
20f80 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
20f90 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
20fa0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
20fb0 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70  fo->nAllField>=p
20fc0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20  PKey2->nField . 
20fd0 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
20fe0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
20ff0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
21000 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
21010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21020 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
21030 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20  nKeyField>0 );. 
21040 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
21050 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
21060 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
21070 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
21080 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  ;..    /* RHS is
21090 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
210a0 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
210b0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
210c0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
210d0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
210e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
210f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
21100 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
21110 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
21120 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
21130 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21140 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
21150 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21160 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
21170 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21180 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==7 ){.        s
21190 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
211a0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
211b0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
211c0 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m1);.        rc 
211d0 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  = -sqlite3IntFlo
211e0 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e  atCompare(pRhs->
211f0 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a  u.i, mem1.u.r);.
21200 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21210 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76       i64 lhs = v
21220 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
21230 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  nt(serial_type, 
21240 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20  &aKey1[d1]);.   
21250 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70       i64 rhs = p
21260 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
21270 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b    if( lhs<rhs ){
21280 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21290 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
212a0 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b  e if( lhs>rhs ){
212b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
212c0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
212d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
212e0 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20   /* RHS is real 
212f0 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
21300 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
21310 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
21320 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
21330 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
21340 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21350 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
21360 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20  /* Serial types 
21370 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72  12 or greater ar
21380 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c  e strings and bl
21390 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61  obs (greater tha
213a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  n.        ** num
213b0 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20  bers). Types 10 
213c0 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65  and 11 are curre
213d0 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66  ntly "reserved f
213e0 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20  or future .     
213f0 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69     ** use", so i
21400 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79  t doesn't really
21410 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
21420 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
21430 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  aring.        **
21440 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69   them to numberi
21450 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a  c values are.  *
21460 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  /.        rc = +
21470 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
21480 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
21490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
214a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
214b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
214c0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
214d0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
214e0 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
214f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72  .        if( ser
21500 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
21510 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d           if( mem
21520 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20  1.u.r<pRhs->u.r 
21530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
21540 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
21550 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31    }else if( mem1
21560 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r>pRhs->u.r )
21570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
21580 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20   = +1;.         
21590 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
215a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
215b0 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
215c0 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69  Compare(mem1.u.i
215d0 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20  , pRhs->u.r);.  
215e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
215f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
21600 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
21610 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
21620 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
21630 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
21640 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
21650 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
21660 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
21670 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
21680 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
21690 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
216a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
216b0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
216c0 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
216d0 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
216e0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
216f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21700 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
21710 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
21720 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
21730 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
21740 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
21750 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
21760 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
21770 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
21780 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
21790 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
217a0 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
217b0 4b 65 79 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  Key1.         ||
217c0 20 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   (pKeyInfo = pPK
217d0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e  ey2->pKeyInfo)->
217e0 6e 41 6c 6c 46 69 65 6c 64 3c 3d 69 0a 20 20 20  nAllField<=i.   
217f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21800 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
21810 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
21820 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
21860 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
21870 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  f( pKeyInfo->aCo
21880 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
21890 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b     mem1.enc = pK
218a0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
218b0 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d         mem1.db =
218c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
218d0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c           mem1.fl
218e0 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ags = MEM_Str;. 
218f0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20           mem1.z 
21900 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  = (char*)&aKey1[
21910 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d1];.          r
21920 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  c = vdbeCompareM
21930 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  emString(.      
21940 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70          &mem1, p
21950 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  Rhs, pKeyInfo->a
21960 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32  Coll[i], &pPKey2
21970 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
21980 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
21990 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
219a0 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d  int nCmp = MIN(m
219b0 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b  em1.n, pRhs->n);
219c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
219d0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
219e0 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
219f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21a00 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65   rc==0 ) rc = me
21a10 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20  m1.n - pRhs->n; 
21a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21a30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21a40 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a   RHS is a blob *
21a50 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
21a60 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
21a70 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61  _Blob ){.      a
21a80 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c  ssert( (pRhs->fl
21a90 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
21aa0 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30  =0 || pRhs->n==0
21ab0 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72   );.      getVar
21ac0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
21ad0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
21ae0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21af0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
21b00 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
21b10 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
21b20 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
21b30 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
21b40 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
21b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
21b60 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
21b70 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
21b80 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21b90 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
21ba0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
21bb0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21bc0 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
21bd0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
21be0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
21bf0 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
21c00 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
21c10 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
21c20 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
21c30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21c40 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
21c50 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21c60 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
21c70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
21c80 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e  }else if( pRhs->
21c90 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
21ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
21cb0 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f  ( !isAllZero((co
21cc0 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31  nst char*)&aKey1
21cd0 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20  [d1],nStr) ){.  
21ce0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
21cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
21d00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
21d10 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
21d20 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
21d30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
21d40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
21d50 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
21d60 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
21d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
21d80 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
21d90 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
21da0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21db0 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
21dc0 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
21dd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21de0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
21df0 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
21e00 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
21e10 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
21e20 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
21e30 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
21e40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
21e50 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
21e60 69 66 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  if( pPKey2->pKey
21e70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
21e80 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
21e90 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
21ea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
21eb0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21ec0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
21ed0 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20  y1, pPKey2, rc) 
21ee0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21ef0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
21f00 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
21f10 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
21f20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21f30 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20     }..    i++;. 
21f40 20 20 20 69 66 28 20 69 3d 3d 70 50 4b 65 79 32     if( i==pPKey2
21f50 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
21f60 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20  ;.    pRhs++;.  
21f70 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
21f80 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
21f90 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
21fa0 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74     idx1 += sqlit
21fb0 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69  e3VarintLen(seri
21fc0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  al_type);.  }whi
21fd0 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e  le( idx1<(unsign
21fe0 65 64 29 73 7a 48 64 72 31 20 26 26 20 64 31 3c  ed)szHdr1 && d1<
21ff0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
22000 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
22010 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
22020 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
22030 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
22040 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
22050 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
22060 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
22070 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
22080 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
22090 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
220a0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
220b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
220c0 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f  ease(&mem1).  */
220d0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
220e0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
220f0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
22100 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
22110 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65  r both of the ke
22120 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
22130 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
22140 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
22150 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
22160 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
22170 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
22180 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
22190 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
221a0 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  T_DB .       || 
221b0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
221c0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
221d0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b  ey1, pPKey2, pPK
221e0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29  ey2->default_rc)
221f0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65   .       || pPKe
22200 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
22210 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
22220 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71   );.  pPKey2->eq
22230 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75  Seen = 1;.  retu
22240 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
22250 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  lt_rc;.}.int sql
22260 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22270 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
22280 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
22290 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
222a0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
222b0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
222c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
222d0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72  ht key */.){.  r
222e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
222f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
22300 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
22310 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
22320 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
22330 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
22340 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
22350 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
22360 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
22370 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
22380 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
22390 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
223a0 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
223b0 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
223c0 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
223d0 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
223e0 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
223f0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
22400 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
22410 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a  than 128)..**.**
22420 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72   To avoid concer
22430 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20  ns about buffer 
22440 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20  overreads, this 
22450 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
22460 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d  used.** on schem
22470 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78  as where the max
22480 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65  imum valid heade
22490 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74  r size is 63 byt
224a0 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73  es or less..*/.s
224b0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
224c0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a  cordCompareInt(.
224d0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
224e0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
224f0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
22500 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
22510 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
22520 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
22530 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
22540 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38  ey = &((const u8
22550 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74  *)pKey1)[*(const
22560 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33   u8*)pKey1 & 0x3
22570 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  F];.  int serial
22580 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20  _type = ((const 
22590 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20  u8*)pKey1)[1];. 
225a0 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20   int res;.  u32 
225b0 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36  y;.  u64 x;.  i6
225c0 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a  4 v;.  i64 lhs;.
225d0 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
225e0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
225f0 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
22600 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
22610 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
22620 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78  *(u8*)pKey1)<=0x
22630 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  3F || CORRUPT_DB
22640 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
22650 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
22660 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
22670 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
22680 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
22690 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
226a0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
226b0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
226c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
226d0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
226e0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
226f0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
22700 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54     lhs = TWO_BYT
22710 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
22720 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
22730 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
22740 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
22750 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
22760 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
22770 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
22780 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
22790 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
227a0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
227b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
227c0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
227d0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
227e0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
227f0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
22800 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
22810 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e   lhs = (i64)*(in
22820 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73  t*)&y;.      tes
22830 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
22840 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22850 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
22860 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
22870 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
22880 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59     lhs = FOUR_BY
22890 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
228a0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
228b0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
228c0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
228d0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
228e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
228f0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f  .    case 6: { /
22900 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
22910 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
22920 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
22930 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
22940 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
22950 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
22960 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73  ey+4);.      lhs
22970 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
22980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
22990 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
229a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
229b0 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73  se 8: .      lhs
229c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
229d0 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20  k;.    case 9:. 
229e0 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20       lhs = 1;.  
229f0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
22a00 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75  /* This case cou
22a10 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69  ld be removed wi
22a20 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74  thout changing t
22a30 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75  he results of ru
22a40 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69  nning.    ** thi
22a50 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e  s code. Includin
22a60 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20  g it causes gcc 
22a70 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61  to generate a fa
22a80 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20  ster switch .   
22a90 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73   ** statement (s
22aa0 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f  ince the range o
22ab0 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73  f switch targets
22ac0 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a   now starts at z
22ad0 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ero and.    ** i
22ae0 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75  s contiguous) bu
22af0 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  t does not cause
22b00 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63   any duplicate c
22b10 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61  ode to be genera
22b20 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67  ted.    ** (as g
22b30 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f  cc is clever eno
22b40 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  ugh to combine t
22b50 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65  he two like case
22b60 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a  s). Other .    *
22b70 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68  * compilers migh
22b80 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a  t be similar.  *
22b90 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63  / .    case 0: c
22ba0 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74  ase 7:.      ret
22bb0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
22bc0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
22bd0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
22be0 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  2);..    default
22bf0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
22c00 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22c10 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
22c20 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20  Key1, pPKey2);. 
22c30 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32   }..  v = pPKey2
22c40 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20  ->aMem[0].u.i;. 
22c50 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20   if( v>lhs ){.  
22c60 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22c70 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r1;.  }else if( 
22c80 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v<lhs ){.    res
22c90 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
22ca0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
22cb0 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
22cc0 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
22cd0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
22ce0 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
22cf0 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72  . Compare the tr
22d00 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66  ailing .    ** f
22d10 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72  ields.  */.    r
22d20 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
22d30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
22d40 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
22d50 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
22d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
22d70 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
22d80 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
22d90 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
22da0 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
22db0 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
22dc0 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
22dd0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
22de0 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
22df0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
22e00 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
22e10 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
22e20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  = 1;.  }..  asse
22e30 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
22e40 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
22e50 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
22e60 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72   res) );.  retur
22e70 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
22e80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
22e90 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
22ea0 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
22eb0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22ec0 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
22ed0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
22ee0 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20   of pPKey2 is a 
22ef0 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29  string, that (b)
22f00 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
22f10 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c  .** uses the col
22f20 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
22f30 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74  BINARY and (c) t
22f40 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
22f50 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a  header varint .*
22f60 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
22f70 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
22f80 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
22f90 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
22fa0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
22fb0 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20  ompareString(.  
22fc0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
22fd0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
22fe0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
22ff0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
23000 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
23010 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
23020 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
23030 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
23040 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69  Key1;.  int seri
23050 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  al_type;.  int r
23060 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
23070 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  PKey2->aMem[0].f
23080 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
23090 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ;.  vdbeAssertFi
230a0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
230b0 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
230c0 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
230d0 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  nfo);.  getVarin
230e0 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
230f0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
23100 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
23110 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
23120 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
23130 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
23140 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
23150 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
23160 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
23170 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
23180 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
23190 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
231a0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
231b0 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
231c0 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
231d0 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
231e0 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
231f0 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
23200 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
23210 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
23220 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
23230 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
23240 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
23250 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
23260 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
23270 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
23280 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
23290 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
232a0 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
232b0 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
232c0 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
232d0 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
232e0 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
232f0 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
23300 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
23310 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
23320 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
23330 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
23340 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
23350 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
23360 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
23370 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
23380 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23390 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
233a0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
233b0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
233c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
233d0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
233e0 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20  lt_rc;.         
233f0 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
23400 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
23410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
23420 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es>0 ){.        
23430 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
23440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23450 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
23460 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d  ey2->r1;.      }
23470 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
23480 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65  es>0 ){.      re
23490 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
234a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
234b0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
234c0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
234d0 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
234e0 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
234f0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
23500 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20  ey2, res).      
23510 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
23520 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
23530 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
23540 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
23550 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
23560 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
23570 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
23580 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
23590 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74  Compare() compat
235a0 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ible function.**
235b0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f   suitable for co
235c0 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a  mparing serializ
235d0 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ed records to th
235e0 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
235f0 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  d passed.** as t
23600 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
23610 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61  ..*/.RecordCompa
23620 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  re sqlite3VdbeFi
23630 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b  ndCompare(Unpack
23640 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
23650 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  /* varintRecordC
23660 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
23670 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
23680 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68  areString() both
23690 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61   assume.  ** tha
236a0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
236b0 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74  ader varint that
236c0 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
236d0 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63  tart of each rec
236e0 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e  ord.  ** fits in
236f0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28   a single byte (
23700 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c  i.e. is 127 or l
23710 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f  ess). varintReco
23720 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20  rdCompareInt(). 
23730 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   ** also assumes
23740 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
23750 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62   to overread a b
23760 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73  uffer by at leas
23770 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69  t the .  ** maxi
23780 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67  mum possible leg
23790 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70  al header size p
237a0 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63  lus 8 bytes. Bec
237b0 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20  ause there is.  
237c0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
237d0 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20   be at least 74 
237e0 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79  (but not 136) by
237f0 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66  tes of padding f
23800 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20  ollowing each.  
23810 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
23820 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64   to varintRecord
23830 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69  CompareInt() thi
23840 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65  s makes it conve
23850 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69  nient to.  ** li
23860 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  mit the size of 
23870 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34  the header to 64
23880 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20   bytes in cases 
23890 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
238a0 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e  field.  ** is an
238b0 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20   integer..  **. 
238c0 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20   ** The easiest 
238d0 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  way to enforce t
238e0 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20  his limit is to 
238f0 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65  consider only re
23900 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20  cords with.  ** 
23910 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73  13 fields or les
23920 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
23930 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65  field is an inte
23940 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ger, the maximum
23950 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64   legal.  ** head
23960 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35  er size is (12*5
23970 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e   + 1 + 1) bytes.
23980 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b    */.  if( p->pK
23990 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
239a0 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  d<=13 ){.    int
239b0 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
239c0 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
239d0 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
239e0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
239f0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
23a00 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
23a10 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
23a20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
23a30 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
23a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23a50 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
23a60 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
23a70 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
23a80 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
23a90 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
23aa0 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
23ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
23ac0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
23ad0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
23ae0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
23af0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
23b00 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
23b10 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
23b20 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
23b30 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
23b40 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
23b50 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
23b60 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
23b70 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
23b80 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
23b90 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
23ba0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
23bb0 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
23bc0 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
23bd0 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
23be0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
23bf0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
23c00 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
23c10 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
23c20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
23c30 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
23c40 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
23c50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
23c60 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
23c70 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
23c80 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
23c90 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
23ca0 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
23cb0 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
23cc0 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
23cd0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
23ce0 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
23cf0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
23d00 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
23d10 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
23d20 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
23d30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
23d40 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
23d50 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
23d60 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
23d70 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
23d80 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
23d90 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
23da0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
23db0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
23dc0 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
23dd0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
23de0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
23df0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
23e00 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
23e10 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
23e20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
23e30 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
23e40 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
23e50 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
23e60 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
23e70 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
23e80 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
23e90 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
23ea0 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
23eb0 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
23ec0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
23ed0 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
23ee0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
23ef0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
23f00 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
23f10 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
23f20 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
23f30 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
23f40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
23f50 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
23f60 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
23f70 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    nCellKey = sql
23f80 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
23f90 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73  Size(pCur);.  as
23fa0 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
23fb0 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
23fc0 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
23fd0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
23fe0 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
23ff0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
24000 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  dex entry */.  s
24010 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
24020 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
24030 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
24040 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
24050 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
24060 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  Key, &m);.  if( 
24070 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
24080 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
24090 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
240a0 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
240b0 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
240c0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
240d0 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
240e0 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
240f0 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
24100 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
24110 3d 6d 2e 6e 20 29 3b 0a 20 20 74 65 73 74 63 61  =m.n );.  testca
24120 73 65 28 20 73 7a 48 64 72 3e 30 78 37 66 66 66  se( szHdr>0x7fff
24130 66 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  ffff );.  assert
24140 28 20 6d 2e 6e 3e 3d 30 20 29 3b 0a 20 20 69 66  ( m.n>=0 );.  if
24150 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
24160 3c 33 20 7c 7c 20 73 7a 48 64 72 3e 28 75 6e 73  <3 || szHdr>(uns
24170 69 67 6e 65 64 29 6d 2e 6e 29 20 29 7b 0a 20 20  igned)m.n) ){.  
24180 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
24190 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
241a0 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
241b0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
241c0 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
241d0 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
241e0 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
241f0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
24200 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
24210 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
24220 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
24230 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
24240 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
24250 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
24260 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
24270 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
24280 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
24290 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
242a0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
242b0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
242c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
242d0 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
242e0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
242f0 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
24300 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
24310 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
24320 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
24330 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
24340 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
24350 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
24360 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
24370 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
24380 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
24390 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
243a0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
243b0 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d  Sizes[typeRowid]
243c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
243d0 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
243e0 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
243f0 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
24400 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
24410 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
24420 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
24430 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
24440 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
24450 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
24460 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
24470 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
24480 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
24490 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
244a0 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
244b0 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
244c0 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
244d0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
244e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
244f0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
24500 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
24510 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
24520 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
24530 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
24540 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
24550 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
24560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24570 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
24580 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
24590 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
245a0 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
245b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
245c0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
245d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
245e0 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
245f0 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
24600 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
24610 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
24620 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
24630 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
24640 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
24650 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
24660 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
24670 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
24680 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
24690 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
246a0 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
246b0 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
246c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
246d0 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
246e0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
246f0 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
24700 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
24710 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
24720 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
24730 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
24740 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
24750 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
24760 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
24770 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
24780 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
24790 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
247a0 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
247b0 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
247c0 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
247d0 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
247e0 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
247f0 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
24800 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
24810 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
24820 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
24830 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
24860 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
24870 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
248a0 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
248b0 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
248c0 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
248d0 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
248e0 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
248f0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
24900 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
24910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24920 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
24930 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
24940 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
24950 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
24960 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
24970 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  ur;.  Mem m;..  
24980 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
24990 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
249a0 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20  REE );.  pCur = 
249b0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
249c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
249d0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
249e0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
249f0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
24a00 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
24a10 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43  e(pCur);.  /* nC
24a20 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
24a30 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
24a40 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
24a50 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
24a60 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
24a70 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
24a80 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
24a90 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
24aa0 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
24ab0 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
24ac0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
24ad0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
24ae0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
24af0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24b00 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
24b10 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
24b20 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
24b30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
24b40 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
24b50 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
24b60 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
24b70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24b80 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73  ;.  }.  *res = s
24b90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
24ba0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
24bb0 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
24bc0 6b 65 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ked, 0);.  sqlit
24bd0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
24be0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
24bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
24c00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24c10 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
24c20 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
24c30 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
24c40 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
24c50 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
24c60 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
24c70 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
24c80 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
24c90 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
24ca0 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
24cb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24cc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
24cd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
24ce0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
24cf0 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
24d00 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
24d10 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
24d20 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
24d30 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
24d40 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
24d50 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
24d60 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
24d70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24d80 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
24d90 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
24da0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
24db0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
24dc0 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
24dd0 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
24de0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
24df0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
24e00 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
24e10 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
24e20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
24e30 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
24e40 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
24e50 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
24e60 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
24e70 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
24e80 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
24e90 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
24ea0 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
24eb0 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
24ec0 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
24ed0 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
24ee0 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
24ef0 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
24f00 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
24f10 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
24f20 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
24f30 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
24f40 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
24f50 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  lete..**.** If i
24f60 43 6f 64 65 20 69 73 20 31 2c 20 74 68 65 6e 20  Code is 1, then 
24f70 65 78 70 69 72 61 74 69 6f 6e 20 69 73 20 61 64  expiration is ad
24f80 76 69 73 6f 72 79 2e 20 20 54 68 65 20 73 74 61  visory.  The sta
24f90 74 65 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  tement should.**
24fa0 20 62 65 20 72 65 70 72 65 70 61 72 65 64 20 62   be reprepared b
24fb0 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 73 74  efore being rest
24fc0 61 72 74 65 64 2c 20 62 75 74 20 69 66 20 69 74  arted, but if it
24fd0 20 69 73 20 61 6c 72 65 61 64 79 20 72 75 6e 6e   is already runn
24fe0 69 6e 67 0a 2a 2a 20 69 74 20 69 73 20 61 6c 6c  ing.** it is all
24ff0 6f 77 65 64 20 74 6f 20 72 75 6e 20 74 6f 20 63  owed to run to c
25000 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ompletion..**.**
25010 20 49 6e 74 65 72 6e 61 6c 6c 79 2c 20 74 68 69   Internally, thi
25020 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
25030 73 65 74 73 20 74 68 65 20 56 64 62 65 2e 65 78  sets the Vdbe.ex
25040 70 69 72 65 64 20 66 6c 61 67 20 6f 6e 20 61 6c  pired flag on al
25050 6c 0a 2a 2a 20 70 72 65 70 61 72 65 64 20 73 74  l.** prepared st
25060 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 66  atements.  The f
25070 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 20  lag is set to 1 
25080 66 6f 72 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  for an immediate
25090 20 65 78 70 69 72 61 74 69 6f 6e 0a 2a 2a 20 61   expiration.** a
250a0 6e 64 20 73 65 74 20 74 6f 20 32 20 66 6f 72 20  nd set to 2 for 
250b0 61 6e 20 61 64 76 69 73 6f 72 79 20 65 78 70 69  an advisory expi
250c0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
250d0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
250e0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
250f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
25100 20 69 43 6f 64 65 29 7b 0a 20 20 56 64 62 65 20   iCode){.  Vdbe 
25110 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
25120 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
25130 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
25140 65 78 70 69 72 65 64 20 3d 20 69 43 6f 64 65 2b  expired = iCode+
25150 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
25160 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
25170 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
25180 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
25190 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
251a0 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
251b0 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
251c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
251d0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 50 52 45  n the SQLITE_PRE
251e0 50 41 52 45 20 66 6c 61 67 73 20 66 6f 72 20 61  PARE flags for a
251f0 20 56 64 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c   Vdbe..*/.u8 sql
25200 69 74 65 33 56 64 62 65 50 72 65 70 61 72 65 46  ite3VdbePrepareF
25210 6c 61 67 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  lags(Vdbe *v){. 
25220 20 72 65 74 75 72 6e 20 76 2d 3e 70 72 65 70 46   return v->prepF
25230 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  lags;.}../*.** R
25240 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
25250 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
25260 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
25270 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
25280 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
25290 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
252a0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
252b0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
252c0 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
252d0 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
252e0 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
252f0 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
25300 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
25310 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
25320 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
25330 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
25340 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
25350 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
25360 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
25370 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
25380 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
25390 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
253a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
253b0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
253c0 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
253d0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
253e0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
253f0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
25400 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
25410 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
25420 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
25430 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26   (v->db->flags &
25440 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
25450 53 47 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  SG)==0 );.    if
25460 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67  ( 0==(pMem->flag
25470 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b  s & MEM_Null) ){
25480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
25490 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c  alue *pRet = sql
254a0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e  ite3ValueNew(v->
254b0 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
254c0 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Ret ){.        s
254d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
254e0 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70  y((Mem *)pRet, p
254f0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
25500 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
25510 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66  ffinity(pRet, af
25520 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  f, SQLITE_UTF8);
25530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
25540 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
25550 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
25560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
25570 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
25580 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
25590 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
255a0 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
255b0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
255c0 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
255d0 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
255e0 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
255f0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
25600 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
25610 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25620 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
25630 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
25640 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
25650 61 72 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ar>0 );.  assert
25660 28 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  ( (v->db->flags 
25670 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51  & SQLITE_EnableQ
25680 50 53 47 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  PSG)==0 );.  if(
25690 20 69 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20   iVar>=32 ){.   
256a0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30   v->expmask |= 0
256b0 78 38 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c  x80000000;.  }el
256c0 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
256d0 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
256e0 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
256f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61  }../*.** Cause a
25700 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72   function to thr
25710 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
25720 74 20 77 61 73 20 63 61 6c 6c 20 66 72 6f 6d 20  t was call from 
25730 4f 50 5f 50 75 72 65 46 75 6e 63 0a 2a 2a 20 72  OP_PureFunc.** r
25740 61 74 68 65 72 20 74 68 61 6e 20 4f 50 5f 46 75  ather than OP_Fu
25750 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50  nction..**.** OP
25760 5f 50 75 72 65 46 75 6e 63 20 6d 65 61 6e 73 20  _PureFunc means 
25770 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
25780 6e 20 6d 75 73 74 20 62 65 20 64 65 74 65 72 6d  n must be determ
25790 69 6e 69 73 74 69 63 2c 20 61 6e 64 20 73 68 6f  inistic, and sho
257a0 75 6c 64 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20  uld.** throw an 
257b0 65 72 72 6f 72 20 69 66 20 69 74 20 69 73 20 67  error if it is g
257c0 69 76 65 6e 20 69 6e 70 75 74 73 20 74 68 61 74  iven inputs that
257d0 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 6e   would make it n
257e0 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
257f0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
25800 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  e is invoked by 
25810 64 61 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69  date/time functi
25820 6f 6e 73 20 74 68 61 74 20 75 73 65 20 6e 6f 6e  ons that use non
25830 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0a 2a  -deterministic.*
25840 2a 20 66 65 61 74 75 72 65 73 20 73 75 63 68 20  * features such 
25850 61 73 20 27 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74  as 'now'..*/.int
25860 20 73 71 6c 69 74 65 33 4e 6f 74 50 75 72 65 46   sqlite3NotPureF
25870 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
25880 65 78 74 20 2a 70 43 74 78 29 7b 0a 23 69 66 64  ext *pCtx){.#ifd
25890 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
258a0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
258b0 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62    if( pCtx->pVdb
258c0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
258d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 43  .#endif.  if( pC
258e0 74 78 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70  tx->pVdbe->aOp[p
258f0 43 74 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65  Ctx->iOp].opcode
25900 3d 3d 4f 50 5f 50 75 72 65 46 75 6e 63 20 29 7b  ==OP_PureFunc ){
25910 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
25920 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
25930 0a 20 20 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74  .       "non-det
25940 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74  erministic funct
25950 69 6f 6e 20 69 6e 20 69 6e 64 65 78 20 65 78 70  ion in index exp
25960 72 65 73 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b  ression or CHECK
25970 20 63 6f 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20   constraint",.  
25980 20 20 20 20 20 2d 31 29 3b 0a 20 20 20 20 72 65       -1);.    re
25990 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
259a0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 1;.}..#ifnd
259b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
259c0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
259d0 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
259e0 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
259f0 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
25a00 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
25a10 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
25a20 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
25a30 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
25a40 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
25a50 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
25a60 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
25a70 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
25a80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
25a90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25aa0 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
25ab0 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
25ac0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
25ad0 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72    if( pVtab->zEr
25ae0 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  rMsg ){.    sqli
25af0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
25b00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
25b10 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
25b20 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
25b30 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
25b40 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
25b50 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
25b60 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
25b70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
25b80 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
25b90 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
25ba0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
25bb0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
25bc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25bd0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
25be0 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  HOOK../*.** If t
25bf0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
25c00 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
25c10 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f  release any allo
25c20 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
25c30 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ed .** with the 
25c40 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20  memory cells in 
25c50 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72  the p->aMem[] ar
25c60 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74  ray. Also free t
25c70 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  he UnpackedRecor
25c80 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  d.** structure i
25c90 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c  tself, using sql
25ca0 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a  ite3DbFree()..**
25cb0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25cc0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66 72 65  n is used to fre
25cd0 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e UnpackedRecord
25ce0 20 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f   structures allo
25cf0 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
25d00 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64  vdbeUnpackRecord
25d10 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e  () function foun
25d20 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a  d in vdbeapi.c..
25d30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
25d40 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
25d50 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
25d60 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65   nField, Unpacke
25d70 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69  dRecord *p){.  i
25d80 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
25d90 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
25da0 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  i<nField; i++){.
25db0 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
25dc0 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20  = &p->aMem[i];. 
25dd0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a       if( pMem->z
25de0 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
25df0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
25e00 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
25e10 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
25e20 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  db, p);.  }.}.#e
25e30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
25e40 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
25e50 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20  HOOK */..#ifdef 
25e60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
25e70 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
25e80 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  ** Invoke the pr
25e90 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49  e-update hook. I
25ea0 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
25eb0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72  ATE or DELETE pr
25ec0 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a  e-update call,.*
25ed0 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61  * then cursor pa
25ee0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
25ef0 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  nd argument shou
25f00 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ld point to the 
25f10 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20  row about.** to 
25f20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c  be update or del
25f30 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70  eted. If the app
25f40 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
25f50 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
25f60 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72  _old(),.** the r
25f70 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69  equired value wi
25f80 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
25f90 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
25fa0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  or points to..*/
25fb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
25fc0 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a  ePreUpdateHook(.
25fd0 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70    /* Vdbe pre-up
26000 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76  date hook is inv
26010 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62  oked by */.  Vdb
26020 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  eCursor *pCsr,  
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26040 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f  Cursor to grab o
26050 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d  ld.* values from
26060 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
26090 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
260a0 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f  r DELETE */.  co
260b0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
260d0 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a   Database name *
260e0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26100 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20      /* Modified 
26110 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69  table */.  i64 i
26120 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20  Key1,           
26130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26140 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20  itial key value 
26150 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
26180 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72   for new.* recor
26190 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
261a0 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20  3 *db = v->db;. 
261b0 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72   i64 iKey2;.  Pr
261c0 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74  eUpdate preupdat
261d0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
261e0 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e  *zTbl = pTab->zN
261f0 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ame;.  static co
26200 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f  nst u8 fakeSortO
26210 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rder = 0;..  ass
26220 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64  ert( db->pPreUpd
26230 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ate==0 );.  mems
26240 65 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30  et(&preupdate, 0
26250 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61  , sizeof(PreUpda
26260 74 65 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52  te));.  if( HasR
26270 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b  owid(pTab)==0 ){
26280 0a 20 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65  .    iKey1 = iKe
26290 79 32 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75  y2 = 0;.    preu
262a0 70 64 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69  pdate.pPk = sqli
262b0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
262c0 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73  ex(pTab);.  }els
262d0 65 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  e{.    if( op==S
262e0 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
262f0 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d        iKey2 = v-
26300 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b  >aMem[iReg].u.i;
26310 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26320 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b    iKey2 = iKey1;
26330 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
26340 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65  sert( pCsr->nFie
26350 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a  ld==pTab->nCol .
26360 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d         || (pCsr-
26370 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
26380 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c  Col+1 && op==SQL
26390 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52  ITE_DELETE && iR
263a0 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20  eg==-1).  );..  
263b0 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b  preupdate.v = v;
263c0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43 73  .  preupdate.pCs
263d0 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75  r = pCsr;.  preu
263e0 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20  pdate.op = op;. 
263f0 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52   preupdate.iNewR
26400 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65  eg = iReg;.  pre
26410 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64  update.keyinfo.d
26420 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64  b = db;.  preupd
26430 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20  ate.keyinfo.enc 
26440 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65  = ENC(db);.  pre
26450 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
26460 4b 65 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d  KeyField = pTab-
26470 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61  >nCol;.  preupda
26480 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74  te.keyinfo.aSort
26490 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61  Order = (u8*)&fa
264a0 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70  keSortOrder;.  p
264b0 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d  reupdate.iKey1 =
264c0 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64   iKey1;.  preupd
264d0 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79  ate.iKey2 = iKey
264e0 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  2;.  preupdate.p
264f0 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64  Tab = pTab;..  d
26500 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
26510 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62  &preupdate;.  db
26520 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
26530 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64  back(db->pPreUpd
26540 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20  ateArg, db, op, 
26550 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31  zDb, zTbl, iKey1
26560 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e  , iKey2);.  db->
26570 70 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a  pPreUpdate = 0;.
26580 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
26590 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52  db, preupdate.aR
265a0 65 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72  ecord);.  vdbeFr
265b0 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
265c0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
265d0 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72  .nKeyField+1, pr
265e0 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
265f0 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
26600 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
26610 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
26620 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64  yField+1, preupd
26630 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64  ate.pNewUnpacked
26640 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61  );.  if( preupda
26650 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69  te.aNew ){.    i
26660 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
26670 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c  0; i<pCsr->nFiel
26680 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
26690 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
266a0 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65 2e  ease(&preupdate.
266b0 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aNew[i]);.    }.
266c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
266d0 65 4e 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74  eNN(db, preupdat
266e0 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23  e.aNew);.  }.}.#
266f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
26700 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
26710 5f 48 4f 4f 4b 20 2a 2f 0a                       _HOOK */.