/ Hex Artifact Content
Login

Artifact 68fd90976d0550bd9ab9ba03befba1f182aadce8bfca7d4b4eb33a2587c925bd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1180: 4e 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c  New = (v->nOpAll
1190: 6f 63 3e 3d 35 31 32 20 3f 20 32 2a 28 73 71 6c  oc>=512 ? 2*(sql
11a0: 69 74 65 33 5f 69 6e 74 36 34 29 76 2d 3e 6e 4f  ite3_int64)v->nO
11b0: 70 41 6c 6c 6f 63 0a 20 20 20 20 20 20 20 20 20  pAlloc.         
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
11d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
11e0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
1200: 33 5f 69 6e 74 36 34 20 6e 4e 65 77 20 3d 20 28  3_int64 nNew = (
1210: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 32 2a  v->nOpAlloc ? 2*
1220: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76  (sqlite3_int64)v
1230: 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20 20 20 20 20  ->nOpAlloc.     
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e     : (sqlite3_in
1260: 74 36 34 29 28 31 30 32 34 2f 73 69 7a 65 6f 66  t64)(1024/sizeof
1270: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44  (Op)));.  UNUSED
1280: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b  _PARAMETER(nOp);
1290: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
12a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69  sure that the si
12b0: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65  ze of a VDBE doe
12c0: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c  s not grow too l
12d0: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e  arge */.  if( nN
12e0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d  ew > p->db->aLim
12f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1300: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20  VDBE_OP] ){.    
1310: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1320: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  p->db);.    retu
1330: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1340: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1350: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
1360: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
1370: 72 74 28 20 6e 4e 65 77 3e 3d 28 76 2d 3e 6e 4f  rt( nNew>=(v->nO
1380: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
1390: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
13a0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
13b0: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
13c0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
13d0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73  pNew ){.    p->s
13e0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  zOpAlloc = sqlit
13f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1400: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ->db, pNew);.   
1410: 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70   v->nOpAlloc = p
1420: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65  ->szOpAlloc/size
1430: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61  of(Op);.    v->a
1440: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
1450: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
1460: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1470: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1480: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1490: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
14a0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
14b0: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
14c0: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
14d0: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
14e0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
14f0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
1500: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
1510: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
1520: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
1530: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
1540: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
1550: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
1560: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1570: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1580: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1590: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
15a0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
15b0: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
15c0: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
15d0: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
15e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
15f0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1600: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1610: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1620: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1630: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1640: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
1650: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
1660: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
1670: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1680: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1690: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
16a0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
16d0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
16e0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
16f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1700: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1710: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1720: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1730: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1740: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1750: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
1760: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1770: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
1780: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
1790: 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  ( p->nOpAlloc<=p
17a0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
17b0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
17c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
17d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
17e0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
17f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1800: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1810: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1830: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
1840: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1850: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
1860: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
1870: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
1880: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
1890: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
18a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
18b0: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f  sert( op>=0 && o
18c0: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
18d0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
18e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
18f0: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1900: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1910: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1920: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1930: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1940: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1950: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1960: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1970: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1980: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1990: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
19a0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
19b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19c0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
19d0: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
19e0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
19f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1a00: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1a10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a20: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a30: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a40: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1a50: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1a60: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1a70: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1a80: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1a90: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1aa0: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1ab0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1ac0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1ad0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
1ae0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
1af0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1b00: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1b30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1b40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1b50: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1b60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1b70: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1b80: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1b90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1bb0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1bc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1bd0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1be0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1bf0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c10: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1c20: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
1c30: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1c40: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1c50: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1c60: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1c70: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1c80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1c90: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cb0: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
1cc0: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
1cd0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ce0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
1cf0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
1d00: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
1d10: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
1d20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
1d30: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1d40: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1d50: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1d60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d70: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1d80: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1d90: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1db0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
1dc0: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
1dd0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
1de0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
1df0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
1e00: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
1e10: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
1e20: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
1e30: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1e40: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1e50: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1e60: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1e70: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1e80: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1e90: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1ea0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1eb0: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1ec0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1ed0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
1ee0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
1ef0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
1f00: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
1f10: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
1f20: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
1f30: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
1f40: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
1f50: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
1f60: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
1f70: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  ng does not end 
1f80: 77 69 74 68 20 22 58 22 20 74 68 65 6e 20 61 6e  with "X" then an
1f90: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 69 6e   OP_ResultRow in
1fa0: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  struction.** is 
1fb0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1fc0: 65 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65  e values inserte
1fd0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1fe0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
2000: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
2010: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
2020: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2030: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
2040: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
2050: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
2060: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
2070: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
2080: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
2090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20a0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
20b0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
20c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20d0: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
20e0: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
20f0: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 69 2c  ng8, 0, iDest+i,
2100: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
2110: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 69 27 20  else if( c=='i' 
2120: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2130: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
2140: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
2150: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
2160: 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +i);.    }else{.
2170: 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2180: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b 0a 20 20  op_resultrow;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
21a0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f  3VdbeAddOp2(p, O
21b0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 44 65  P_ResultRow, iDe
21c0: 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f 6f 70 5f  st, i);.skip_op_
21d0: 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20 76 61 5f  resultrow:.  va_
21e0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
21f0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2200: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2210: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
2220: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2240: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2260: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2270: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2280: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2290: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
22b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22c0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
22d0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
22e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
22f0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2300: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2310: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2320: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2330: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
2340: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
2350: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
2360: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
2370: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
2380: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2390: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
23a0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
23b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
23c0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
23d0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
23e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
23f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2400: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2410: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
2420: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
2430: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
2440: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
2450: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2460: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2470: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2480: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2490: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24b0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
24c0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
24d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24e0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
24f0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2500: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2510: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2520: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2530: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2540: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2550: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2560: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2570: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2580: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2590: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
25a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
25b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
25c0: 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44  wNN(sqlite3VdbeD
25d0: 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(p), 8);.  if( 
25e0: 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28  p4copy ) memcpy(
25f0: 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b  p4copy, zP4, 8);
2600: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2610: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f  3VdbeAddOp4(p, o
2620: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70  p, p1, p2, p3, p
2630: 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a  4copy, p4type);.
2640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2650: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
2660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2670: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63  address of the c
2680: 75 72 72 65 6e 74 20 45 58 50 4c 41 49 4e 20 51  urrent EXPLAIN Q
2690: 55 45 52 59 20 50 4c 41 4e 20 62 61 73 65 6c 69  UERY PLAN baseli
26a0: 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 22  ne..** 0 means "
26b0: 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  none"..*/.int sq
26c0: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
26d0: 50 61 72 65 6e 74 28 50 61 72 73 65 20 2a 70 50  Parent(Parse *pP
26e0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 4f 70 20  arse){.  VdbeOp 
26f0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 50 61 72  *pOp;.  if( pPar
2700: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 3d  se->addrExplain=
2710: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2720: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2730: 62 65 47 65 74 4f 70 28 70 50 61 72 73 65 2d 3e  beGetOp(pParse->
2740: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 61  pVdbe, pParse->a
2750: 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 72  ddrExplain);.  r
2760: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 7d  eturn pOp->p2;.}
2770: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 64 65  ../*.** Set a de
2780: 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
2790: 74 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t on the followi
27a0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  ng routine in or
27b0: 64 65 72 20 74 6f 0a 2a 2a 20 6d 6f 6e 69 74 6f  der to.** monito
27c0: 72 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  r the EXPLAIN QU
27d0: 45 52 59 20 50 4c 41 4e 20 63 6f 64 65 20 67 65  ERY PLAN code ge
27e0: 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  neration..*/.#if
27f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2800: 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69  DEBUG).void sqli
2810: 74 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70  te3ExplainBreakp
2820: 6f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  oint(const char 
2830: 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *z1, const char 
2840: 2a 7a 32 29 7b 0a 20 20 28 76 6f 69 64 29 7a 31  *z2){.  (void)z1
2850: 3b 0a 20 20 28 76 6f 69 64 29 7a 32 3b 0a 7d 0a  ;.  (void)z2;.}.
2860: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
2870: 64 20 61 20 6e 65 77 20 4f 50 5f 20 6f 70 63 6f  d a new OP_ opco
2880: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  de..**.** If the
2890: 20 62 50 75 73 68 20 66 6c 61 67 20 69 73 20 74   bPush flag is t
28a0: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  rue, then make t
28b0: 68 69 73 20 6f 70 63 6f 64 65 20 74 68 65 20 70  his opcode the p
28c0: 61 72 65 6e 74 20 66 6f 72 0a 2a 2a 20 73 75 62  arent for.** sub
28d0: 73 65 71 75 65 6e 74 20 45 78 70 6c 61 69 6e 73  sequent Explains
28e0: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 56 64   until sqlite3Vd
28f0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 29 20 69  beExplainPop() i
2900: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69  s called..*/.voi
2910: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  d sqlite3VdbeExp
2920: 6c 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lain(Parse *pPar
2930: 73 65 2c 20 75 38 20 62 50 75 73 68 2c 20 63 6f  se, u8 bPush, co
2940: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2950: 2e 2e 2e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ...){.#ifndef SQ
2960: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
2970: 41 6c 77 61 79 73 20 69 6e 63 6c 75 64 65 20 74  Always include t
2980: 68 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  he OP_Explain op
2990: 63 6f 64 65 73 20 69 66 20 53 51 4c 49 54 45 5f  codes if SQLITE_
29a0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
29b0: 2e 0a 20 20 2a 2a 20 42 75 74 20 6f 6d 69 74 20  ..  ** But omit 
29c0: 74 68 65 6d 20 28 66 6f 72 20 70 65 72 66 6f 72  them (for perfor
29d0: 6d 61 6e 63 65 29 20 64 75 72 69 6e 67 20 70 72  mance) during pr
29e0: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 20  oduction builds 
29f0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
2a00: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
2a10: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 63 68 61  ndif.  {.    cha
2a20: 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62  r *zMsg;.    Vdb
2a30: 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73  e *v;.    va_lis
2a40: 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 69 54  t ap;.    int iT
2a50: 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  his;.    va_star
2a60: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
2a70: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 56   zMsg = sqlite3V
2a80: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a90: 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  db, zFmt, ap);. 
2aa0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
2ab0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
2ac0: 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 73 20  Vdbe;.    iThis 
2ad0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71  = v->nOp;.    sq
2ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2af0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
2b00: 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e 61 64  This, pParse->ad
2b10: 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20  drExplain, 0,.  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e      zMsg, P4_DYN
2b40: 41 4d 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  AMIC);.    sqlit
2b50: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2b60: 69 6e 74 28 62 50 75 73 68 3f 22 50 55 53 48 22  int(bPush?"PUSH"
2b70: 3a 22 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  :"", sqlite3Vdbe
2b80: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 70 34 2e  GetOp(v,-1)->p4.
2b90: 7a 29 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73  z);.    if( bPus
2ba0: 68 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  h){.      pParse
2bb0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
2bc0: 69 54 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  iThis;.    }.  }
2bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68  .}../*.** Pop th
2be0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
2bf0: 50 4c 41 4e 20 73 74 61 63 6b 20 6f 6e 65 20 6c  PLAN stack one l
2c00: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
2c10: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
2c20: 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
2c30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e){.  sqlite3Exp
2c40: 6c 61 69 6e 42 72 65 61 6b 70 6f 69 6e 74 28 22  lainBreakpoint("
2c50: 50 4f 50 22 2c 20 30 29 3b 0a 20 20 70 50 61 72  POP", 0);.  pPar
2c60: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20  se->addrExplain 
2c70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
2c80: 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 72 73  lainParent(pPars
2c90: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
2ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2cb0: 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  AIN */../*.** Ad
2cc0: 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68  d an OP_ParseSch
2cd0: 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ema opcode.  Thi
2ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f  s routine is bro
2cf0: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  ken out from.** 
2d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d10: 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65  4() since it nee
2d20: 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73  ds to also needs
2d30: 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72   to mark all btr
2d40: 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67  ees.** as having
2d50: 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a   been used..**.*
2d60: 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72  * The zWhere str
2d70: 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  ing must have be
2d80: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2d90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2da0: 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  )..** This routi
2db0: 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e  ne will take own
2dc0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c  ership of the al
2dd0: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a  located memory..
2de0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2df0: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
2e00: 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  aOp(Vdbe *p, int
2e10: 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65   iDb, char *zWhe
2e20: 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  re){.  int j;.  
2e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e40: 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(p, OP_ParseSch
2e50: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ema, iDb, 0, 0, 
2e60: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
2e70: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
2e80: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
2e90: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
2ea0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
2ec0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
2ed0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
2ee0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
2ef0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2f00: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
2f10: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
2f20: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
2f30: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
2f40: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f60: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2f70: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2f80: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2f90: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2fa0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2fb0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fe0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2ff0: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
3000: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
3010: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
3020: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
3030: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3040: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
3050: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
3060: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
3070: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
3080: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3090: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
30a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
30b0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70   P4_INT32;.    p
30c0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20  Op->p4.i = p4;. 
30d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
30e0: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74  ;.}../* Insert t
30f0: 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72  he end of a co-r
3100: 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73  outine.*/.void s
3110: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
3120: 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20  outine(Vdbe *v, 
3130: 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20  int regYield){. 
3140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3150: 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
3160: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
3170: 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68  ;..  /* Clear th
3180: 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  e temporary regi
3190: 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72  ster cache, ther
31a0: 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61  eby ensuring tha
31b0: 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72  t each.  ** co-r
31c0: 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f  outine has its o
31d0: 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  wn independent s
31e0: 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c  et of registers,
31f0: 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74   because co-rout
3200: 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20  ines.  ** might 
3210: 65 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67  expect their reg
3220: 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65  isters to be pre
3230: 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e  served across an
3240: 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20   OP_Yield, and. 
3250: 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63   ** that could c
3260: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66  ause problems if
3270: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d   two or more co-
3280: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69  routines are usi
3290: 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  ng the same.  **
32a0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
32b0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70  ter..  */.  v->p
32c0: 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
32d0: 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65  = 0;.  v->pParse
32e0: 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
32f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3300: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
3310: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
3320: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
3330: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
3340: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
3350: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
3360: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
3370: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
3380: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
3390: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
33a0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
33b0: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
33c0: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
33d0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
33e0: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
33f0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
3400: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
3410: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
3420: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
3430: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
3440: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
3450: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
3460: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
3470: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
3480: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
3490: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
34a0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
34b0: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
34c0: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
34d0: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
34e0: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
34f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
3500: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
3510: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
3520: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
3530: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
3540: 2a 20 28 4c 61 74 65 72 3a 29 20 54 68 69 73 20  * (Later:) This 
3550: 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72  is only true for
3560: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 68 61   opcodes that ha
3570: 76 65 20 74 68 65 20 4f 50 46 4c 47 5f 4a 55 4d  ve the OPFLG_JUM
3580: 50 0a 2a 2a 20 70 72 6f 70 65 72 74 79 2e 0a 2a  P.** property..*
3590: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 75 73  *.** Variable us
35a0: 61 67 65 20 6e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a  age notes:.**.**
35b0: 20 20 20 20 20 50 61 72 73 65 2e 61 4c 61 62 65       Parse.aLabe
35c0: 6c 5b 78 5d 20 20 20 20 20 53 74 6f 72 65 73 20  l[x]     Stores 
35d0: 74 68 65 20 61 64 64 72 65 73 73 20 74 68 61 74  the address that
35e0: 20 74 68 65 20 78 2d 74 68 20 6c 61 62 65 6c 20   the x-th label 
35f0: 72 65 73 6f 6c 76 65 73 0a 2a 2a 20 20 20 20 20  resolves.**     
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 69 6e 74 6f 2e 20 20 46 6f 72 20 74      into.  For t
3620: 65 73 74 69 6e 67 20 28 53 51 4c 49 54 45 5f 44  esting (SQLITE_D
3630: 45 42 55 47 29 2c 20 75 6e 72 65 73 6f 6c 76 65  EBUG), unresolve
3640: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 62               lab
3660: 65 6c 73 20 73 74 6f 72 65 73 20 2d 31 2c 20 62  els stores -1, b
3670: 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 72  ut that is not r
3680: 65 71 75 69 72 65 64 2e 0a 2a 2a 20 20 20 20 20  equired..**     
3690: 50 61 72 73 65 2e 6e 4c 61 62 65 6c 41 6c 6c 6f  Parse.nLabelAllo
36a0: 63 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c  c   Number of sl
36b0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ots allocated to
36c0: 20 50 61 72 73 65 2e 61 4c 61 62 65 6c 5b 5d 0a   Parse.aLabel[].
36d0: 2a 2a 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61  **     Parse.nLa
36e0: 62 65 6c 20 20 20 20 20 20 20 20 54 68 65 20 2a  bel        The *
36f0: 6e 65 67 61 74 69 76 65 2a 20 6f 66 20 74 68 65  negative* of the
3700: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c   number of label
3710: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 62 65 65 6e 20 69 73 73 75         been issu
3740: 65 64 2e 20 20 54 68 65 20 6e 65 67 61 74 69 76  ed.  The negativ
3750: 65 20 69 73 20 73 74 6f 72 65 64 20 62 65 63 61  e is stored beca
3760: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  use.**          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3780: 68 61 74 20 67 69 76 65 73 20 61 20 70 65 72 66  hat gives a perf
3790: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
37a0: 65 6e 74 20 6f 76 65 72 20 73 74 6f 72 69 6e 67  ent over storing
37b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
37d0: 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69 74  equivalent posit
37e0: 69 76 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e  ive value..*/.in
37f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
3800: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 50  eLabel(Parse *pP
3810: 61 72 73 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  arse){.  return 
3820: 2d 2d 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  --pParse->nLabel
3830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
3840: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
3850: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
3860: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3870: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
3880: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
3890: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
38a0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
38b0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
38c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
38d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
38e0: 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  l()..*/.static S
38f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
3900: 6f 69 64 20 72 65 73 69 7a 65 52 65 73 6f 6c 76  oid resizeResolv
3910: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 2c  eLabel(Parse *p,
3920: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6a 29   Vdbe *v, int j)
3930: 7b 0a 20 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  {.  int nNewSize
3940: 20 3d 20 31 30 20 2d 20 70 2d 3e 6e 4c 61 62 65   = 10 - p->nLabe
3950: 6c 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  l;.  p->aLabel =
3960: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
3970: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
3980: 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20  ->aLabel,.      
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
39a0: 4e 65 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70  NewSize*sizeof(p
39b0: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20  ->aLabel[0]));. 
39c0: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d   if( p->aLabel==
39d0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  0 ){.    p->nLab
39e0: 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  elAlloc = 0;.  }
39f0: 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
3a00: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 6e  ITE_DEBUG.    in
3a10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
3a20: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20 69  ->nLabelAlloc; i
3a30: 3c 6e 4e 65 77 53 69 7a 65 3b 20 69 2b 2b 29 20  <nNewSize; i++) 
3a40: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
3a50: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  1;.#endif.    p-
3a60: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 6e  >nLabelAlloc = n
3a70: 4e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 2d 3e  NewSize;.    p->
3a80: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3a90: 4f 70 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  Op;.  }.}.void s
3aa0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
3ab0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
3ac0: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
3ad0: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
3ae0: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
3af0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
3b00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3b10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3b20: 72 74 28 20 6a 3c 2d 70 2d 3e 6e 4c 61 62 65 6c  rt( j<-p->nLabel
3b30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
3b40: 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
3b50: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
3b60: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
3b70: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
3b80: 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
3b90: 74 66 28 22 52 45 53 4f 4c 56 45 20 4c 41 42 45  tf("RESOLVE LABE
3ba0: 4c 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 78  L %d to %d\n", x
3bb0: 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 7d 0a 23  , v->nOp);.  }.#
3bc0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e  endif.  if( p->n
3bd0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 2b 20 70 2d 3e  LabelAlloc + p->
3be0: 6e 4c 61 62 65 6c 20 3c 20 30 20 29 7b 0a 20 20  nLabel < 0 ){.  
3bf0: 20 20 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c    resizeResolveL
3c00: 61 62 65 6c 28 70 2c 76 2c 6a 29 3b 0a 20 20 7d  abel(p,v,j);.  }
3c10: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
3c20: 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d  ( p->aLabel[j]==
3c30: 28 2d 31 29 20 29 3b 20 2f 2a 20 4c 61 62 65 6c  (-1) ); /* Label
3c40: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
3c50: 73 6f 6c 76 65 64 20 6f 6e 63 65 20 2a 2f 0a 20  solved once */. 
3c60: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20     p->aLabel[j] 
3c70: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a  = v->nOp;.  }.}.
3c80: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3c90: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3ca0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3cb0: 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f   one time..*/.vo
3cc0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  id sqlite3VdbeRu
3cd0: 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a  nOnlyOnce(Vdbe *
3ce0: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
3cf0: 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Once = 1;.}../*.
3d00: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
3d10: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
3d20: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c   only be run mul
3d30: 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a  tiple times..*/.
3d40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3d50: 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70  Reusable(Vdbe *p
3d60: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
3d70: 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64  nce = 0;.}..#ifd
3d80: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
3d90: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
3da0: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
3db0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
3dc0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
3dd0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
3de0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
3df0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3e00: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
3e10: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
3e20: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
3e30: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
3e40: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
3e50: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
3e60: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
3e70: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
3e80: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3e90: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
3ea0: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
3eb0: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
3ec0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
3ed0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
3ee0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
3f10: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
3f20: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
3f30: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3f40: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
3f50: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
3f60: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
3f70: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
3f80: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
3f90: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
3fa0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3fb0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
3fc0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
3fd0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
3fe0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
3ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
4000: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
4010: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
4020: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
4030: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
4040: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4050: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
4060: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4080: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4090: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
40a0: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
40b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
40c0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
40d0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
40e0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
40f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4100: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
4110: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
4120: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
4130: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
4140: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
4150: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
4160: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
4170: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
4180: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
4190: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
41a0: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
41b0: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
41c0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
41d0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
41e0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
41f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4200: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
4210: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
4220: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
4230: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
4240: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
4250: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
4260: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
4270: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
4280: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
4290: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
42a0: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
42b0: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
42c0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
42d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
42e0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
42f0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
4300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
4310: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
4320: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
4330: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
4340: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
4350: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
4360: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4370: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
4380: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
4390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
43a0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
43b0: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
43c0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
43d0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
43e0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
43f0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
4400: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
4410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
4420: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4440: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
4450: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
4460: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
4470: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4480: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
4490: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
44a0: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
44b0: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
44c0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
44d0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
44e0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
44f0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
4500: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
4510: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
4520: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
4530: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
4540: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
4550: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
4560: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
4570: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
4580: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
4590: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
45a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
45b0: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
45c0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
45d0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
45e0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
45f0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
4600: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
4610: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
4620: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
4630: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
4640: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
4650: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
4660: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
4670: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
4680: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
4690: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
46a0: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
46b0: 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f 49  ateBtree/BTREE_I
46c0: 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e 69  NTKEY and OP_Ini
46d0: 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 20  tCoroutine .**  
46e0: 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45 20      (for CREATE 
46f0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
4700: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
4710: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
4720: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
4730: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
4740: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
4750: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
4760: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
4770: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4780: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
4790: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
47a0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
47b0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
47c0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
47d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
47e0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
47f0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
4800: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
4810: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4820: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
4830: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
4840: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
4850: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
4860: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
4870: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
4880: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
4890: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
48a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
48b0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
48c0: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
48d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
48e0: 43 72 65 61 74 65 49 6e 64 65 78 20 3d 20 30 3b  CreateIndex = 0;
48f0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
4900: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
4910: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
4920: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
4930: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
4940: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
4950: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
4960: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
4970: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
4980: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
4990: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
49a0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
49b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
49c0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
49d0: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
49e0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
49f0: 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d       || opcode==
4a00: 4f 50 5f 56 44 65 73 74 72 6f 79 0a 20 20 20 20  OP_VDestroy.    
4a10: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
4a20: 46 75 6e 63 74 69 6f 6e 30 20 26 26 20 70 4f 70  Function0 && pOp
4a30: 2d 3e 70 34 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  ->p4.pFunc->func
4a40: 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
4a50: 43 5f 49 4e 54 45 52 4e 41 4c 29 0a 20 20 20 20  C_INTERNAL).    
4a60: 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50   || ((opcode==OP
4a70: 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d  _Halt || opcode=
4a80: 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20  =OP_HaltIfNull) 
4a90: 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d  .      && ((pOp-
4aa0: 3e 70 31 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  >p1)!=SQLITE_OK 
4ab0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41  && pOp->p2==OE_A
4ac0: 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20  bort)).    ){.  
4ad0: 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31      hasAbort = 1
4ae0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4af0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
4b00: 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74  ode==OP_CreateBt
4b10: 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ree && pOp->p3==
4b20: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20 68  BTREE_INTKEY ) h
4b30: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
4b40: 31 3b 0a 20 20 20 20 69 66 28 20 6d 61 79 41 62  1;.    if( mayAb
4b50: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ort ){.      /* 
4b60: 68 61 73 43 72 65 61 74 65 49 6e 64 65 78 20 6d  hasCreateIndex m
4b70: 61 79 20 61 6c 73 6f 20 62 65 20 73 65 74 20 66  ay also be set f
4b80: 6f 72 20 73 6f 6d 65 20 44 45 4c 45 54 45 20 73  or some DELETE s
4b90: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
4ba0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  se.      ** OP_C
4bb0: 6c 65 61 72 2e 20 53 6f 20 74 68 69 73 20 72 6f  lear. So this ro
4bc0: 75 74 69 6e 65 20 6d 61 79 20 65 6e 64 20 75 70  utine may end up
4bd0: 20 72 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   returning true 
4be0: 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20  in the case .   
4bf0: 20 20 20 2a 2a 20 77 68 65 72 65 20 61 20 22 44     ** where a "D
4c00: 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 22 20  ELETE FROM tbl" 
4c10: 68 61 73 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  has a statement-
4c20: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 64 6f 65 73  journal but does
4c30: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65   not.      ** re
4c40: 71 75 69 72 65 20 6f 6e 65 2e 20 54 68 69 73 20  quire one. This 
4c50: 69 73 20 6e 6f 74 20 73 6f 20 62 61 64 20 2d 20  is not so bad - 
4c60: 69 74 20 69 73 20 61 6e 20 69 6e 65 66 66 69 63  it is an ineffic
4c70: 69 65 6e 63 79 2c 20 6e 6f 74 20 61 20 62 75 67  iency, not a bug
4c80: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f  . */.      if( o
4c90: 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65  pcode==OP_Create
4ca0: 42 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33  Btree && pOp->p3
4cb0: 3d 3d 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20  ==BTREE_BLOBKEY 
4cc0: 29 20 68 61 73 43 72 65 61 74 65 49 6e 64 65 78  ) hasCreateIndex
4cd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
4ce0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6c 65 61 72  opcode==OP_Clear
4cf0: 20 29 20 68 61 73 43 72 65 61 74 65 49 6e 64 65   ) hasCreateInde
4d00: 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  x = 1;.    }.   
4d10: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4d20: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20  InitCoroutine ) 
4d30: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
4d40: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
4d50: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
4d60: 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70  N_KEY.    if( op
4d70: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
4d80: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
4d90: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29   && pOp->p2==1 )
4da0: 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75  {.      hasFkCou
4db0: 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nter = 1;.    }.
4dc0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
4dd0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
4de0: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
4df0: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
4e00: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
4e10: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
4e20: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
4e30: 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49  occurred..  ** I
4e40: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c  f malloc failed,
4e50: 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28   then the while(
4e60: 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79  ) loop above may
4e70: 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74   not have iterat
4e80: 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ed.  ** through 
4e90: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  all opcodes and 
4ea0: 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20  hasAbort may be 
4eb0: 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
4ec0: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   Return.  ** tru
4ed0: 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20  e for this case 
4ee0: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61  to prevent the a
4ef0: 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63  ssert() in the c
4f00: 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a  allers frame.  *
4f10: 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20  * from failing. 
4f20: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76   */.  return ( v
4f30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4f40: 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d  ed || hasAbort==
4f50: 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46  mayAbort || hasF
4f60: 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20  kCounter.       
4f70: 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54 61   || (hasCreateTa
4f80: 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f  ble && hasInitCo
4f90: 72 6f 75 74 69 6e 65 29 20 7c 7c 20 68 61 73 43  routine) || hasC
4fa0: 72 65 61 74 65 49 6e 64 65 78 0a 20 20 29 3b 0a  reateIndex.  );.
4fb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4fc0: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
4fd0: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
4fe0: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
4ff0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
5000: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e  E_DEBUG./*.** In
5010: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69  crement the nWri
5020: 74 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68  te counter in th
5030: 65 20 56 44 42 45 20 69 66 20 74 68 65 20 63 75  e VDBE if the cu
5040: 72 73 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a  rsor is not an.*
5050: 2a 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  * ephemeral curs
5060: 6f 72 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75  or, or if the cu
5070: 72 73 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73  rsor argument is
5080: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   NULL..*/.void s
5090: 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72  qlite3VdbeIncrWr
50a0: 69 74 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20  iteCounter(Vdbe 
50b0: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
50c0: 70 43 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30  pC){.  if( pC==0
50d0: 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72  .   || (pC->eCur
50e0: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f  Type!=CURTYPE_SO
50f0: 52 54 45 52 0a 20 20 20 20 20 20 20 26 26 20 70  RTER.       && p
5100: 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  C->eCurType!=CUR
5110: 54 59 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20  TYPE_PSEUDO.    
5120: 20 20 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68     && !pC->isEph
5130: 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20  emeral).  ){.   
5140: 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20   p->nWrite++;.  
5150: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
5160: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5170: 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20  /*.** Assert if 
5180: 61 6e 20 41 62 6f 72 74 20 61 74 20 74 68 69 73  an Abort at this
5190: 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d   point in time m
51a0: 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
51b0: 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61   corrupt.** data
51c0: 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
51d0: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41  lite3VdbeAssertA
51e0: 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70  bortable(Vdbe *p
51f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5200: 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e  nWrite==0 || p->
5210: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
5220: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
5230: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5240: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
5250: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
5260: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
5270: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
5280: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
5290: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
52a0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
52b0: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
52c0: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
52d0: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
52e0: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
52f0: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
5300: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
5310: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
5320: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
5330: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
5340: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
5350: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
5360: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
5370: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
5380: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
5390: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
53a0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
53b0: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
53c0: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
53d0: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
53e0: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
53f0: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
5400: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
5410: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
5420: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
5430: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
5440: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
5450: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
5460: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
5470: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
5480: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
5490: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
54a0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
54b0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
54c0: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
54d0: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
54e0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
54f0: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
5500: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
5510: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
5520: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
5530: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
5540: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
5550: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
5560: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
5570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
5580: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
5590: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
55a0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
55b0: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
55c0: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
55d0: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
55e0: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
55f0: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
5600: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
5610: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
5620: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
5630: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
5640: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
5650: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
5660: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
5670: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
5680: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
5690: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
56a0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
56b0: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
56c0: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
56d0: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
56e0: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
56f0: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
5700: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
5710: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
5720: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
5730: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
5740: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
5750: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
5760: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
5770: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
5780: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
5790: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
57a0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
57b0: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
57c0: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
57d0: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
57e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
57f0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
5800: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
5810: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
5820: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
5830: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
5840: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
5850: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
5860: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
5870: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
5880: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
5890: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
58a0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
58b0: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
58c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
58d0: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
58e0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
58f0: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
5900: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
5910: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
5920: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
5930: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
5940: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
5950: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
5960: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
5970: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
5980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5990: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
59a0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
59b0: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
59c0: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
59d0: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
59e0: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
59f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
5a00: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
5a10: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
5a20: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
5a30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5a40: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
5a50: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
5a60: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
5a70: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
5a80: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
5a90: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
5aa0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
5ab0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5ac0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
5ad0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
5ae0: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
5af0: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
5b00: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5b10: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5b20: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
5b30: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
5b40: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
5b50: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
5b60: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
5b70: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
5b80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5b90: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
5ba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5bc0: 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a  case OP_Prev: {.
5bd0: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
5be0: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
5bf0: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
5c00: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  s;.          pOp
5c10: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
5c20: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20  VANCE;.         
5c30: 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e   /* The code gen
5c40: 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64  erator never cod
5c50: 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  es any of these 
5c60: 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d  opcodes as a jum
5c70: 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  p.          ** t
5c80: 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79  o a label.  They
5c90: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65   are always code
5ca0: 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b  d as a jump back
5cb0: 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20  wards to a .    
5cc0: 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61        ** known a
5cd0: 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ddress */.      
5ce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5cf0: 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  >p2>=0 );.      
5d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5d10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
5d20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5d30: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61  TABLE.        ca
5d40: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
5d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5d60: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
5d70: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
5d80: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
5d90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5da0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5db0: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
5dc0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
5dd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5de0: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d  pOp - p->aOp) >=
5df0: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3 );.          
5e00: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
5e10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
5e20: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er );.          
5e30: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
5e40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e            if( n>
5e50: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5e60: 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  rgs = n;.       
5e70: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5e80: 67 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61  gh into the defa
5e90: 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ult case */.    
5ea0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
5eb0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
5ec0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
5ed0: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
5ee0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b         /* The mk
5ef0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69  opcodeh.tcl scri
5f00: 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67  pt has so arrang
5f10: 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74  ed things that t
5f20: 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  he only.        
5f30: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
5f40: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
5f50: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5f60: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
5f70: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  teed to.        
5f80: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
5f90: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
5fa0: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
5fb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5fc0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5fd0: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5fe0: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
5ff0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
6000: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28     assert( ADDR(
6010: 70 4f 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73 65  pOp->p2)<-pParse
6020: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
6030: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
6040: 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f  = aLabel[ADDR(pO
6050: 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20  p->p2)];.       
6060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
6070: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
6090: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
60a0: 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f  cl script has so
60b0: 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73   arranged things
60c0: 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20   that the only. 
60d0: 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70       ** non-jump
60e0: 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68   opcodes less th
60f0: 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d  an SQLITE_MX_JUM
6100: 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61  P_CODE are guara
6110: 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a  nteed to.      *
6120: 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74  * have non-negat
6130: 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50  ive values for P
6140: 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  2. */.      asse
6150: 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  rt( (sqlite3Opco
6160: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
6170: 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55  opcode]&OPFLG_JU
6180: 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  MP)==0 || pOp->p
6190: 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2>=0);.    }.   
61a0: 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70   if( pOp==p->aOp
61b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f   ) break;.    pO
61c0: 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p--;.  }.  sqlit
61d0: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
61e0: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
61f0: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
6200: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
6210: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
6220: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
6230: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
6240: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
6250: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
6260: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
6270: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
6280: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
6290: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
62a0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
62b0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
62c0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
62d0: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
62e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
62f0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
6300: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
6310: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
6320: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 74  * Verify that at
6330: 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20   least N opcode 
6340: 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61  slots are availa
6350: 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74  ble in p without
6360: 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61  .** having to ma
6370: 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70  lloc for more sp
6380: 61 63 65 20 28 65 78 63 65 70 74 20 77 68 65 6e  ace (except when
6390: 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a   compiled using.
63a0: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ** SQLITE_TEST_R
63b0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20  EALLOC_STRESS). 
63c0: 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   This interface 
63d0: 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
63e0: 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72  esting.** to ver
63f0: 69 66 79 20 74 68 61 74 20 63 65 72 74 61 69 6e  ify that certain
6400: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
6420: 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61   can never.** fa
6430: 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20  il due to a OOM 
6440: 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20  fault and hence 
6450: 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 20  that the return 
6460: 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71  value from.** sq
6470: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
6480: 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73  st() will always
6490: 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f   be non-NULL..*/
64a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
64b0: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  ITE_DEBUG) && !d
64c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
64d0: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
64e0: 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  S).void sqlite3V
64f0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
6500: 63 52 65 71 75 69 72 65 64 28 56 64 62 65 20 2a  cRequired(Vdbe *
6510: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
6520: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20  ert( p->nOp + N 
6530: 3c 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  <= p->nOpAlloc )
6540: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
6550: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
6560: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
6570: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
6580: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
6590: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
65a0: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
65b0: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
65c0: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
65d0: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
65e0: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
65f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
6600: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6610: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
6620: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
6630: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
6640: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
6650: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
6660: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
6670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6680: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
6690: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
66a0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
66b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
66c0: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
66d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
66e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
66f0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
6700: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6710: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
6720: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
6730: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6740: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
6750: 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72  a single OP_Abor
6760: 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68  table opcode) th
6770: 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66  at will.** verif
6780: 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  y that the VDBE 
6790: 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65  program can safe
67a0: 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e  ly call Abort in
67b0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
67c0: 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20  context..*/.#if 
67d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
67e0: 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74  EBUG).void sqlit
67f0: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
6800: 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69  table(Vdbe *p, i
6810: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69  nt onError){.  i
6820: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
6830: 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64  bort ) sqlite3Vd
6840: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41  beAddOp0(p, OP_A
6850: 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e  bortable);.}.#en
6860: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
6870: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6880: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6890: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
68a0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
68b0: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
68c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
68d0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
68e0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
68f0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
6900: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
6910: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
6920: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
6930: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
6940: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
6950: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
6960: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
6970: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
6980: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
6990: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
69a0: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
69b0: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
69c0: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
69d0: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
69e0: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
69f0: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
6a00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
6a10: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
6a20: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
6a30: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
6a40: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
6a50: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
6a60: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
6a70: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
6a80: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
6a90: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
6aa0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
6ab0: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
6ac0: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
6ad0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6ae0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
6af0: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
6b00: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
6b10: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
6b20: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
6b30: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
6b40: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
6b50: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
6b60: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
6b70: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
6b80: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
6b90: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
6ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
6bb0: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
6bc0: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
6bd0: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
6be0: 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   Return a.** poi
6bf0: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
6c00: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
6c10: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d  rted..**.** Non-
6c20: 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74  zero P2 argument
6c30: 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75  s to jump instru
6c40: 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d  ctions are autom
6c50: 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65  atically adjuste
6c60: 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  d.** so that the
6c70: 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20   jump target is 
6c80: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
6c90: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
6ca0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
6cb0: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6cc0: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
6cd0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6cf0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
6d00: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
6d10: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6d40: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
6d50: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
6d60: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
6d70: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6d80: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
6d90: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
6dc0: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
6dd0: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
6de0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
6df0: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
6e00: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
6e10: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
6e20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6e30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6e40: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
6e50: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
6e60: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20   growOpArray(p, 
6e70: 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nOp) ){.    retu
6e80: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72  rn 0;.  }.  pFir
6e90: 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e  st = pOut = &p->
6ea0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66  aOp[p->nOp];.  f
6eb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
6ec0: 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b  ++, aOp++, pOut+
6ed0: 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70  +){.    pOut->op
6ee0: 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f  code = aOp->opco
6ef0: 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31  de;.    pOut->p1
6f00: 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20   = aOp->p1;.    
6f10: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e  pOut->p2 = aOp->
6f20: 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p2;.    assert( 
6f30: 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  aOp->p2>=0 );.  
6f40: 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70    if( (sqlite3Op
6f50: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70  codeProperty[aOp
6f60: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
6f70: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f  G_JUMP)!=0 && aO
6f80: 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20  p->p2>0 ){.     
6f90: 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e   pOut->p2 += p->
6fa0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nOp;.    }.    p
6fb0: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70  Out->p3 = aOp->p
6fc0: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  3;.    pOut->p4t
6fd0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
6fe0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70  ;.    pOut->p4.p
6ff0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
7000: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
7010: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
7020: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
7030: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
7040: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
7050: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
7060: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75  COVERAGE.    pOu
7070: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  t->iSrcLine = iL
7080: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20  ineno+i;.#else. 
7090: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
70a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
70b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
70c0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
70d0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
70e0: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
70f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
7100: 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f  intOp(0, i+p->nO
7110: 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e  p, &p->aOp[i+p->
7120: 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  nOp]);.    }.#en
7130: 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70  dif.  }.  p->nOp
7140: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72   += nOp;.  retur
7150: 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66  n pFirst;.}..#if
7160: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7170: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
7180: 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64  STATUS)./*.** Ad
7190: 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
71a0: 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74  e array of count
71b0: 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73  ers managed by s
71c0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
71d0: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69  status()..*/.voi
71e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61  d sqlite3VdbeSca
71f0: 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20  nStatus(.  Vdbe 
7200: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d             /* VM
7220: 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74   to add scanstat
7230: 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  us() to */.  int
7240: 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20   addrExplain,   
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7260: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78  Address of OP_Ex
7270: 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a  plain (or 0) */.
7280: 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20    int addrLoop, 
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
72b0: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20  loop counter */ 
72c0: 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74  .  int addrVisit
72d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
72e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
72f0: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f   rows visited co
7300: 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73  unter */.  LogEs
7310: 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20  t nEst,         
7320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
7330: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
7340: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f  f output rows */
7350: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7360: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
7370: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
7380: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69  ble or index bei
7390: 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b  ng scanned */.){
73a0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
73b0: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63   nByte = (p->nSc
73c0: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53  an+1) * sizeof(S
73d0: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63  canStatus);.  Sc
73e0: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a  anStatus *aNew;.
73f0: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74    aNew = (ScanSt
7400: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52  atus*)sqlite3DbR
7410: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
7420: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a  >aScan, nByte);.
7430: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
7440: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e    ScanStatus *pN
7450: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53  ew = &aNew[p->nS
7460: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77  can++];.    pNew
7470: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
7480: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
7490: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20   pNew->addrLoop 
74a0: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20  = addrLoop;.    
74b0: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20  pNew->addrVisit 
74c0: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20  = addrVisit;.   
74d0: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45   pNew->nEst = nE
74e0: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  st;.    pNew->zN
74f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7500: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61  trDup(p->db, zNa
7510: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61  me);.    p->aSca
7520: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  n = aNew;.  }.}.
7530: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
7540: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
7550: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f  of the opcode, o
7560: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72  r P1, P2, P3, or
7570: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20   P5 operands.** 
7580: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
7590: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
75a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
75b0: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65  hangeOpcode(Vdbe
75c0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 75   *p, int addr, u
75d0: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20  8 iNewOpcode){. 
75e0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
75f0: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64  p(p,addr)->opcod
7600: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a  e = iNewOpcode;.
7610: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7620: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
7630: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
7640: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
7650: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
7660: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p1 = val;.}.
7670: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7680: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
7690: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
76a0: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
76b0: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
76c0: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p2 = val;.}.vo
76d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
76e0: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
76f0: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
7700: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
7710: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
7720: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p3 = val;.}.void
7730: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7740: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31  geP5(Vdbe *p, u1
7750: 36 20 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28  6 p5){.  assert(
7760: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
7770: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7780: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
7790: 3e 30 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >0 ) p->aOp[p->n
77a0: 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d  Op-1].p5 = p5;.}
77b0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
77c0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
77d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
77e0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
77f0: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
7800: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
7810: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
7820: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
7830: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
7840: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
7850: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c  int addr){.  sql
7860: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
7870: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
7880: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
7890: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
78a0: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
78b0: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
78c0: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
78d0: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
78e0: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
78f0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
7900: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
7910: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
7920: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  n(sqlite3 *db, F
7930: 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20  uncDef *pDef){. 
7940: 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
7950: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
7960: 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b  UNC_EPHEM)!=0 ){
7970: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7980: 65 65 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a  eeNN(db, pDef);.
7990: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
79a0: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
79b0: 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70  ay(sqlite3 *, Op
79c0: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a   *, int);../*.**
79d0: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c   Delete a P4 val
79e0: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ue if necessary.
79f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
7a00: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
7a10: 66 72 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65  freeP4Mem(sqlite
7a20: 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a  3 *db, Mem *p){.
7a30: 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f    if( p->szMallo
7a40: 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  c ) sqlite3DbFre
7a50: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
7a60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
7a70: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73  eeNN(db, p);.}.s
7a80: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
7a90: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
7aa0: 34 46 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33  4FuncCtx(sqlite3
7ab0: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f   *db, sqlite3_co
7ac0: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65  ntext *p){.  fre
7ad0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
7ae0: 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29  on(db, p->pFunc)
7af0: 3b 0a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ;. sqlite3DbFree
7b00: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
7b10: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
7b20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
7b30: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
7b40: 34 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62  4){.  assert( db
7b50: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34   );.  switch( p4
7b60: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
7b70: 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20   P4_FUNCCTX: {. 
7b80: 20 20 20 20 20 66 72 65 65 50 34 46 75 6e 63 43       freeP4FuncC
7b90: 74 78 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f  tx(db, (sqlite3_
7ba0: 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20  context*)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 52 45 41  .    case P4_REA
7bd0: 4c 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  L:.    case P4_I
7be0: 4e 54 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50  NT64:.    case P
7bf0: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63  4_DYNAMIC:.    c
7c00: 61 73 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a  ase P4_DYNBLOB:.
7c10: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
7c20: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
7c30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7c40: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7c60: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
7c70: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
7c80: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
7c90: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
7ca0: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
7cb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7cc0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
7cd0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
7ce0: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
7cf0: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
7d00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7d10: 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34  te(db, (Expr*)p4
7d20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7d30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
7d40: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
7d50: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70  : {.      freeEp
7d60: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
7d70: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
7d80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7d90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7da0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69  4_MEM: {.      i
7db0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
7dc0: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
7dd0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7de0: 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee((sqlite3_valu
7df0: 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65  e*)p4);.      }e
7e00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65  lse{.        fre
7e10: 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a  eP4Mem(db, (Mem*
7e20: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )p4);.      }.  
7e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
7e50: 42 20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  B : {.      if( 
7e60: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
7e70: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61  ==0 ) sqlite3Vta
7e80: 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20  bUnlock((VTable 
7e90: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7ea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
7eb0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
7ec0: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
7ed0: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
7ee0: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
7ef0: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
7f00: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
7f10: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
7f20: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
7f30: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
7f40: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
7f50: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
7f60: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
7f70: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
7f80: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
7f90: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
7fa0: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
7fb0: 20 20 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70      for(pOp=&aOp
7fc0: 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f  [nOp-1]; pOp>=aO
7fd0: 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20  p; pOp--){.     
7fe0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
7ff0: 20 3c 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c   <= P4_FREE_IF_L
8000: 45 20 29 20 66 72 65 65 50 34 28 64 62 2c 20 70  E ) freeP4(db, p
8010: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
8020: 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53  >p4.p);.#ifdef S
8030: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
8040: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
8050: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8060: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
8070: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
8080: 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69   .    }.    sqli
8090: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
80a0: 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  aOp);.  }.}../*.
80b0: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
80c0: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
80d0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
80e0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
80f0: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
8100: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
8110: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
8120: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
8130: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
8140: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
8150: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
8160: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
8170: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
8180: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
8190: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
81a0: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
81b0: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
81c0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
81d0: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
81e0: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
81f0: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
8200: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
8210: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71  P_Noop.*/.int sq
8220: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
8230: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
8240: 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65  nt addr){.  Vdbe
8250: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70  Op *pOp;.  if( p
8260: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8270: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
8280: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
8290: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20   && addr<p->nOp 
82a0: 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  );.  pOp = &p->a
82b0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65  Op[addr];.  free
82c0: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
82d0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
82e0: 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  );.  pOp->p4type
82f0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
8300: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a   pOp->p4.z = 0;.
8310: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
8320: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72  OP_Noop;.  retur
8330: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
8340: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
8350: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20   is "op" and it 
8360: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65  is not a jump de
8370: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  stination,.** th
8380: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52  en remove it.  R
8390: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
83a0: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63  d only if an opc
83b0: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  ode was removed.
83c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
83d0: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
83e0: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
83f0: 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e   op){.  if( p->n
8400: 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70  Op>0 && p->aOp[p
8410: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
8420: 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =op ){.    retur
8430: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  n sqlite3VdbeCha
8440: 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e  ngeToNoop(p, p->
8450: 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  nOp-1);.  }else{
8460: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
8480: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
8490: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
84a0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
84b0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
84c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
84d0: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
84e0: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
84f0: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
8500: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
8510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8520: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
8530: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
8540: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
8550: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
8560: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
8570: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
8580: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
8590: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
85a0: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
85b0: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
85c0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
85d0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
85e0: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
85f0: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
8600: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
8610: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
8620: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
8630: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
8640: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
8650: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
8660: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
8670: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
8680: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
8690: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
86a0: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
86b0: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
86c0: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
86d0: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
86e0: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
86f0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
8700: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
8710: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
8720: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
8730: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
8740: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
8750: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
8760: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
8770: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
8780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8790: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
87a0: 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c   vdbeChangeP4Ful
87b0: 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20  l(.  Vdbe *p,.  
87c0: 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74  Op *pOp,.  const
87d0: 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e   char *zP4,.  in
87e0: 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70  t n.){.  if( pOp
87f0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
8800: 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f  freeP4(p->db, pO
8810: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
8820: 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  p4.p);.    pOp->
8830: 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  p4type = 0;.    
8840: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
8850: 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a   }.  if( n<0 ){.
8860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8870: 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29  hangeP4(p, (int)
8880: 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20  (pOp - p->aOp), 
8890: 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  zP4, n);.  }else
88a0: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
88b0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
88c0: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
88d0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
88e0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
88f0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
8900: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
8910: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
8920: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8930: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
8940: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
8950: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
8960: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
8970: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8980: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
8990: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
89a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
89b0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
89c0: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
89d0: 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d  p->aOp!=0 || db-
89e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
89f0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
8a00: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
8a10: 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  f( n!=P4_VTAB ) 
8a20: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
8a30: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
8a40: 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  P4);.    return;
8a50: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
8a60: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
8a70: 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  ert( addr<p->nOp
8a80: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
8a90: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
8aa0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
8ab0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
8ac0: 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30  ddr];.  if( n>=0
8ad0: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20   || pOp->p4type 
8ae0: 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67  ){.    vdbeChang
8af0: 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20  eP4Full(p, pOp, 
8b00: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74  zP4, n);.    ret
8b10: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
8b20: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
8b30: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
8b40: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
8b50: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
8b60: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
8b70: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
8b80: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
8b90: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
8ba0: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
8bb0: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
8bc0: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
8bd0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
8be0: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
8bf0: 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20  if( zP4!=0 ){.  
8c00: 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b    assert( n<0 );
8c10: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
8c20: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
8c30: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
8c40: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
8c50: 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41     if( n==P4_VTA
8c60: 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c  B ) sqlite3VtabL
8c70: 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34  ock((VTable*)zP4
8c80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8c90: 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70  Change the P4 op
8ca0: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73  erand of the mos
8cb0: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
8cc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a   instruction .**
8cd0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65   to the value de
8ce0: 66 69 6e 65 64 20 62 79 20 74 68 65 20 61 72 67  fined by the arg
8cf0: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73  uments.  This is
8d00: 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a   a high-speed.**
8d10: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
8d20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
8d30: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  )..**.** The P4 
8d40: 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74  operand must not
8d50: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
8d60: 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20  ously defined.  
8d70: 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50  And the new.** P
8d80: 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34  4 must not be P4
8d90: 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c  _INT32.  Use sql
8da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
8db0: 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a  () in either of.
8dc0: 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a  ** those cases..
8dd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8de0: 64 62 65 41 70 70 65 6e 64 50 34 28 56 64 62 65  dbeAppendP4(Vdbe
8df0: 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20   *p, void *pP4, 
8e00: 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70  int n){.  VdbeOp
8e10: 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28   *pOp;.  assert(
8e20: 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20   n!=P4_INT32 && 
8e30: 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20  n!=P4_VTAB );.  
8e40: 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a  assert( n<=0 );.
8e50: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
8e60: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8e70: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e   freeP4(p->db, n
8e80: 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b  , pP4);.  }else{
8e90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 34  .    assert( pP4
8ea0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
8eb0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
8ec0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
8ed0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20  [p->nOp-1];.    
8ee0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
8ef0: 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20  ype==P4_NOTUSED 
8f00: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
8f10: 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d  pe = n;.    pOp-
8f20: 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d  >p4.p = pP4;.  }
8f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
8f40: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
8f50: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8f60: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
8f70: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
8f80: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
8f90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8fa0: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
8fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
8fc0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
8fd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
8fe0: 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Vdbe;.  KeyInfo 
8ff0: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73  *pKeyInfo;.  ass
9000: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
9010: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
9020: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73  ;.  pKeyInfo = s
9030: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
9040: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64  ndex(pParse, pId
9050: 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  x);.  if( pKeyIn
9060: 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  fo ) sqlite3Vdbe
9070: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79  AppendP4(v, pKey
9080: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
9090: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
90a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
90b0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a  IN_COMMENTS./*.*
90c0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
90d0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  ment on the most
90e0: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
90f0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
9100: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
9110: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
9120: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
9130: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
9140: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
9150: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
9160: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
9170: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
9180: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
9190: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
91a0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  n build..*/.stat
91b0: 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d  ic void vdbeVCom
91c0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
91d0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
91e0: 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a  t, va_list ap){.
91f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
9200: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
9210: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9220: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
9230: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
9240: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
9250: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9260: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
9270: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9280: 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  aOp );.    sqlit
9290: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
92a0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
92b0: 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  .zComment);.    
92c0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
92d0: 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69  .zComment = sqli
92e0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
92f0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
9300: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
9310: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
9320: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
9330: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
9340: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
9350: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
9360: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
9370: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
9380: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
9390: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
93a0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
93b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
93c0: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
93d0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
93e0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
93f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
9400: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
9410: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
9420: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76   OP_Noop);.    v
9430: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
9440: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
9450: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
9460: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
9470: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
9480: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
9490: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
94a0: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
94b0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
94c0: 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c  lue if the iSrcL
94d0: 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68  ine field for th
94e0: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64  e previously cod
94f0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
9500: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9510: 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72  dbeSetLineNumber
9520: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c  (Vdbe *v, int iL
9530: 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ine){.  sqlite3V
9540: 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e  dbeGetOp(v,-1)->
9550: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
9560: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9570: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
9580: 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  GE */../*.** Ret
9590: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
95a0: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
95b0: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
95c0: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
95d0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
95e0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
95f0: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
9600: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
9610: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
9620: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
9630: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
9640: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
9650: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
9660: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
9670: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
9680: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
9690: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
96a0: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
96b0: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
96c0: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
96d0: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
96e0: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
96f0: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
9700: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
9710: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
9720: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
9730: 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68  n OOM fault with
9740: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68  out having to ch
9750: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
9760: 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a  e return from .*
9770: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
9780: 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  s a valid pointe
9790: 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  r.  But because 
97a0: 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65  the dummy.opcode
97b0: 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20   is 0,.** dummy 
97c0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72  will never be wr
97d0: 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20  itten to.  This 
97e0: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63  is verified by c
97f0: 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61  ode inspection a
9800: 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67  nd.** by running
9810: 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a   with Valgrind..
9820: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
9830: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
9840: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
9850: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
9860: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
9870: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
9880: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
9890: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
98a0: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
98b0: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
98c0: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
98d0: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
98e0: 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f  /.  static VdbeO
98f0: 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e  p dummy;  /* Ign
9900: 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72  ore the MSVC war
9910: 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e  ning about no in
9920: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61  itializer */.  a
9930: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9940: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
9950: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
9960: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
9970: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
9980: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
9990: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
99a0: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
99b0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
99c0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
99d0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
99e0: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
99f0: 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mmy;.  }else{.  
9a00: 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70    return &p->aOp
9a10: 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23  [addr];.  }.}..#
9a20: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
9a30: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
9a40: 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a  _COMMENTS)./*.**
9a50: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
9a60: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65  er value for one
9a70: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
9a80: 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65  rs to the opcode
9a90: 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   pOp.** determin
9aa0: 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20  ed by character 
9ab0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
9ac0: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72   translateP(char
9ad0: 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f   c, const Op *pO
9ae0: 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27  p){.  if( c=='1'
9af0: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
9b00: 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20  1;.  if( c=='2' 
9b10: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32  ) return pOp->p2
9b20: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29  ;.  if( c=='3' )
9b30: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b   return pOp->p3;
9b40: 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20  .  if( c=='4' ) 
9b50: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69  return pOp->p4.i
9b60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
9b70: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p5;.}../*.** Com
9b80: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f  pute a string fo
9b90: 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20  r the "comment" 
9ba0: 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20  field of a VDBE 
9bb0: 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a  opcode listing..
9bc0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73  **.** The Synops
9bd0: 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d  is: field in com
9be0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62  ments in the vdb
9bf0: 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20  e.c source file 
9c00: 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a  gets converted.*
9c10: 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74  * to an extra st
9c20: 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70  ring that is app
9c30: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c  ended to the sql
9c40: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
9c50: 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73  .  In the.** abs
9c60: 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f  ence of other co
9c70: 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e  mments, this syn
9c80: 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68  opsis becomes th
9c90: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
9ca0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65   opcode..** Some
9cb0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63   translation occ
9cc0: 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  urs:.**.**      
9cd0: 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22   "PX"      ->  "
9ce0: 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22  r[X]".**       "
9cf0: 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b  PX@PY"   ->  "r[
9d00: 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22  X..X+Y-1]"  or "
9d10: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20  r[x]" if y is 0 
9d20: 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50  or 1.**       "P
9d30: 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58  X@PY+1" ->  "r[X
9d40: 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72  ..X+Y]"    or "r
9d50: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a  [x]" if y is 0.*
9d60: 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22  *       "PY..PY"
9d70: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20    ->  "r[X..Y]" 
9d80: 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69       or "r[x]" i
9d90: 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63  f y<=x.*/.static
9da0: 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d   int displayComm
9db0: 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20  ent(.  const Op 
9dc0: 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pOp,     /* The
9dd0: 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f   opcode to be co
9de0: 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e  mmented */.  con
9df0: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20  st char *zP4,   
9e00: 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62  /* Previously ob
9e10: 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72  tained value for
9e20: 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   P4 */.  char *z
9e30: 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57  Temp,       /* W
9e40: 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65  rite result here
9e50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20   */.  int nTemp 
9e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
9e70: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a  e available in z
9e80: 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63  Temp[] */.){.  c
9e90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
9ea0: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
9eb0: 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69   *zSynopsis;.  i
9ec0: 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e  nt nOpName;.  in
9ed0: 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72  t ii, jj;.  char
9ee0: 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70   zAlt[50];.  zOp
9ef0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70  Name = sqlite3Op
9f00: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
9f10: 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65  code);.  nOpName
9f20: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9f30: 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69  30(zOpName);.  i
9f40: 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61  f( zOpName[nOpNa
9f50: 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me+1] ){.    int
9f60: 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20   seenCom = 0;.  
9f70: 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53    char c;.    zS
9f80: 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d  ynopsis = zOpNam
9f90: 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31  e += nOpName + 1
9fa0: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
9fb0: 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20  p(zSynopsis,"IF 
9fc0: 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)==0 ){.     
9fd0: 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
9fe0: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b  QLITE_STOREP2 ){
9ff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a000: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
a010: 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72  (zAlt), zAlt, "r
a020: 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53  [P2] = (%s)", zS
a030: 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20  ynopsis+3);.    
a040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a050: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a060: 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20  f(sizeof(zAlt), 
a070: 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74  zAlt, "if %s got
a080: 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73  o P2", zSynopsis
a090: 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +3);.      }.   
a0a0: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
a0b0: 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Alt;.    }.    f
a0c0: 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e  or(ii=jj=0; jj<n
a0d0: 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a  Temp-1 && (c = z
a0e0: 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30  Synopsis[ii])!=0
a0f0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
a100: 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20  f( c=='P' ){.   
a110: 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73       c = zSynops
a120: 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20  is[++ii];.      
a130: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a    if( c=='4' ){.
a140: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a150: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
a160: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
a170: 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20  %s", zP4);.     
a180: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a190: 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'X' ){.         
a1a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a1b0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
a1c0: 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  p+jj, "%s", pOp-
a1d0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
a1e0: 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20        seenCom = 
a1f0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
a200: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
a210: 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v1 = translateP(
a220: 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  c, pOp);.       
a230: 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20     int v2;.     
a240: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
a250: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
a260: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20  zTemp+jj, "%d", 
a270: 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  v1);.          i
a280: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
a290: 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c  psis+ii+1, "@P",
a2a0: 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   2)==0 ){.      
a2b0: 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20        ii += 3;. 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d             jj +=
a2d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a2e0: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
a2f0: 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61          v2 = tra
a300: 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69  nslateP(zSynopsi
a310: 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20  s[ii], pOp);.   
a320: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
a330: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
a340: 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29  i+1,"+1",2)==0 )
a350: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a360: 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ii += 2;.       
a370: 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20         v2++;.   
a380: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a390: 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20         if( v2>1 
a3a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a3b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a3c0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
a3d0: 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31  p+jj, "..%d", v1
a3e0: 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  +v2-1);.        
a3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a400: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
a410: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
a420: 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20  , "..P3", 4)==0 
a430: 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b  && pOp->p3==0 ){
a440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20  .            ii 
a450: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
a460: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
a470: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
a480: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
a490: 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  jj);.      }else
a4a0: 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  {.        zTemp[
a4b0: 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20  jj++] = c;.     
a4c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a4d0: 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c   !seenCom && jj<
a4e0: 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e  nTemp-5 && pOp->
a4f0: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
a500: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a510: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
a520: 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70  mp+jj, "; %s", p
a530: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
a540: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
a550: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
a560: 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  +jj);.    }.    
a570: 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a  if( jj<nTemp ) z
a580: 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20  Temp[jj] = 0;.  
a590: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a  }else if( pOp->z
a5a0: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  Comment ){.    s
a5b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a5c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
a5d0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
a5e0: 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c  t);.    jj = sql
a5f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
a600: 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mp);.  }else{.  
a610: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
a620: 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a      jj = 0;.  }.
a630: 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23    return jj;.}.#
a640: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a650: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44  DEBUG */..#if VD
a660: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26  BE_DISPLAY_P4 &&
a670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a680: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
a690: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  NTS)./*.** Trans
a6a0: 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78 70  late the P4.pExp
a6b0: 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f  r value for an O
a6c0: 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63  P_CursorHint opc
a6d0: 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a  ode into text.**
a6e0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69 73   that can be dis
a6f0: 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50 34  played in the P4
a700: 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41   column of EXPLA
a710: 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74  IN output..*/.st
a720: 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
a730: 79 50 34 45 78 70 72 28 53 74 72 41 63 63 75 6d  yP4Expr(StrAccum
a740: 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72   *p, Expr *pExpr
a750: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
a760: 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74  *zOp = 0;.  swit
a770: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a780: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
a790: 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ING:.      sqlit
a7a0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
a7b0: 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  , "%Q", pExpr->u
a7c0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
a7d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a7e0: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
a7f0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a800: 70 65 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70  pendf(p, "%d", p
a810: 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
a820: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a830: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
a840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a850: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55  r_appendf(p, "NU
a860: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
a870: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
a880: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
a890: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a8a0: 65 6e 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c  endf(p, "r[%d]",
a8b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
a8c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a8d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a8e0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
a8f0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
a900: 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
a910: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a920: 6e 64 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b  ndf(p, "rowid");
a930: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a950: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25  r_appendf(p, "c%
a960: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
a970: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
a980: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a990: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a9a0: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
a9b0: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
a9c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
a9d0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
a9e0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a9f0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
aa00: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
aa10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa20: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
aa30: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
aa40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aa50: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
aa60: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
aa70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aa80: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
aa90: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
aaa0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
aab0: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
aac0: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
aad0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
aae0: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
aaf0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
ab00: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
ab10: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
ab20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
ab30: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
ab40: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
ab50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ab60: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
ab70: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
ab80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ab90: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
aba0: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
abb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
abc0: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
abd0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
abe0: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
abf0: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
ac00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
ac10: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
ac20: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
ac30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ac40: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
ac50: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
ac60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
ac70: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
ac80: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
ac90: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
aca0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
acb0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
acc0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
acd0: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
ace0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
acf0: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
ad00: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
ad10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ad20: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
ad30: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
ad40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
ad50: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
ad60: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
ad70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
ad80: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
ad90: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
ada0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
adb0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
adc0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
add0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
ade0: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
adf0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
ae00: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
ae10: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
ae20: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
ae30: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
ae40: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
ae50: 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b  , "%s", "expr");
ae60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ae70: 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a  }..  if( zOp ){.
ae80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
ae90: 61 70 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22  appendf(p, "%s("
aea0: 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70  , zOp);.    disp
aeb0: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
aec0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
aed0: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
aee0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
aef0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c  e3_str_append(p,
af00: 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ",", 1);.      
af10: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c  displayP4Expr(p,
af20: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
af30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
af40: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c  e3_str_append(p,
af50: 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a   ")", 1);.  }.}.
af60: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
af70: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
af80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
af90: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
afa0: 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44   */...#if VDBE_D
afb0: 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20  ISPLAY_P4./*.** 
afc0: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
afd0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
afe0: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
aff0: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
b000: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
b010: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
b020: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
b030: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
b040: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
b050: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
b060: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
b070: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
b080: 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75  zTemp;.  StrAccu
b090: 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  m x;.  assert( n
b0a0: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71  Temp>=20 );.  sq
b0b0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
b0c0: 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20  t(&x, 0, zTemp, 
b0d0: 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69  nTemp, 0);.  swi
b0e0: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
b0f0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
b100: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
b110: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65   int j;.      Ke
b120: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
b130: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
b140: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
b150: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
b160: 74 46 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20  tFlags!=0 );.   
b170: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b180: 70 70 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64  ppendf(&x, "k(%d
b190: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  ", pKeyInfo->nKe
b1a0: 79 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66  yField);.      f
b1b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
b1c0: 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a  fo->nKeyField; j
b1d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
b1e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
b1f0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
b200: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
b210: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43  char *zColl = pC
b220: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
b230: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  me : "";.       
b240: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c   if( strcmp(zCol
b250: 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20  l, "BINARY")==0 
b260: 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20  ) zColl = "B";. 
b270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
b280: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b290: 2c 25 73 25 73 25 73 22 2c 20 0a 20 20 20 20 20  ,%s%s%s", .     
b2a0: 20 20 20 20 20 20 20 20 20 20 28 70 4b 65 79 49            (pKeyI
b2b0: 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b  nfo->aSortFlags[
b2c0: 6a 5d 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44  j] & KEYINFO_ORD
b2d0: 45 52 5f 44 45 53 43 29 20 3f 20 22 2d 22 20 3a  ER_DESC) ? "-" :
b2e0: 20 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20   "", .          
b2f0: 20 20 20 20 20 28 70 4b 65 79 49 6e 66 6f 2d 3e       (pKeyInfo->
b300: 61 53 6f 72 74 46 6c 61 67 73 5b 6a 5d 20 26 20  aSortFlags[j] & 
b310: 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 42 49  KEYINFO_ORDER_BI
b320: 47 4e 55 4c 4c 29 3f 20 22 4e 2e 22 20 3a 20 22  GNULL)? "N." : "
b330: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
b340: 20 20 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20     zColl);.     
b350: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b360: 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20  _str_append(&x, 
b370: 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  ")", 1);.      b
b380: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  reak;.    }.#ifd
b390: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b3a0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
b3b0: 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20    case P4_EXPR: 
b3c0: 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50  {.      displayP
b3d0: 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70  4Expr(&x, pOp->p
b3e0: 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  4.pExpr);.      
b3f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b400: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
b410: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
b420: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
b430: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
b440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b450: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b460: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
b470: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
b480: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b490: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
b4a0: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
b4b0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
b4c0: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
b4d0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b4e0: 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20  f(&x, "%s(%d)", 
b4f0: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
b500: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
b510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
b520: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b530: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
b540: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
b550: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
b560: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  CTX: {.      Fun
b570: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
b580: 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63  ->p4.pCtx->pFunc
b590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b5a0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b5b0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
b5c0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
b5d0: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
b5e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b5f0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
b600: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b610: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b620: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
b630: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
b640: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b650: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
b660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b670: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b680: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
b690: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b6a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
b6b0: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
b6c0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b6d0: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a  f(&x, "%.16g", *
b6e0: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
b6f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b700: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
b710: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
b720: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
b730: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
b740: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
b750: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
b760: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
b770: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b780: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
b790: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65  EM_Int|MEM_IntRe
b7a0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  al) ){.        s
b7b0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b7c0: 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70  df(&x, "%lld", p
b7d0: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
b7e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
b7f0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
b800: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
b810: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b820: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  (&x, "%.16g", pM
b830: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
b840: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
b850: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
b860: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
b870: 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20  = "NULL";.      
b880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
b890: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
b8a0: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
b8b0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
b8c0: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
b8d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b8e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b8f0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b900: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
b910: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
b920: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
b930: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
b940: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
b950: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b960: 65 6e 64 66 28 26 78 2c 20 22 76 74 61 62 3a 25  endf(&x, "vtab:%
b970: 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  p", pVtab);.    
b980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b990: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
b9a0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
b9b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
b9c0: 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e   int *ai = pOp->
b9d0: 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74  p4.ai;.      int
b9e0: 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a   n = ai[0];   /*
b9f0: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
ba00: 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41  nt of an INTARRA
ba10: 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a  Y is always the.
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20         ** count 
ba40: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
ba50: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c   elements to fol
ba60: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  low */.      for
ba70: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
ba80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ba90: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
baa0: 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b  , ",%d", ai[i]);
bab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
bac0: 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20  Temp[0] = '[';. 
bad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
bae0: 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c  _append(&x, "]",
baf0: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
bb00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bb10: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20   P4_SUBPROGRAM: 
bb20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
bb30: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
bb40: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
bb50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bb60: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42 4c     case P4_DYNBL
bb70: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  OB:.    case P4_
bb80: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
bb90: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
bba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bbb0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54 41  }.    case P4_TA
bbc0: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
bbd0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
bbe0: 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  (&x, "%s", pOp->
bbf0: 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  p4.pTab->zName);
bc00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bc10: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
bc20: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
bc30: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
bc40: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
bc50: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
bc60: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
bc70: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
bc80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
bc90: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
bca0: 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74  sh(&x);.  assert
bcb0: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
bcc0: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
bcd0: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
bce0: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  AY_P4 */../*.** 
bcf0: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
bd00: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
bd10: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
bd20: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
bd30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
bd40: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
bd50: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
bd60: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
bd70: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
bd80: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
bd90: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
bda0: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
bdb0: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
bdc0: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
bdd0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
bde0: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
bdf0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
be00: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
be10: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
be20: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
be30: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
be40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
be50: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
be60: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
be70: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
be80: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
be90: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
bea0: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
beb0: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
bec0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
bed0: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
bee0: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
bef0: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
bf00: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
bf10: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
bf20: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
bf30: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
bf40: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
bf50: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
bf60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
bf70: 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20  ED_CACHE)./*.** 
bf80: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
bf90: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
bfa0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
bfb0: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
bfc0: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
bfd0: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
bfe0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
bff0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
c000: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
c010: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
c020: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
c030: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
c040: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
c050: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
c060: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
c070: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
c080: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
c090: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
c0a0: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
c0b0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
c0c0: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
c0d0: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
c0e0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
c0f0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
c100: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
c110: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
c120: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
c130: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
c140: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
c150: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
c160: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
c170: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
c180: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
c190: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
c1a0: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
c1b0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
c1c0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
c1d0: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
c1e0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
c1f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
c200: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
c210: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
c220: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
c230: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
c240: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
c250: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
c260: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
c270: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
c280: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
c290: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
c2a0: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
c2b0: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
c2c0: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
c2d0: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
c2e0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
c2f0: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
c300: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
c310: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
c320: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
c330: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
c340: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
c350: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
c360: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
c370: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
c380: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
c390: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
c3a0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
c3b0: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
c3c0: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
c3d0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
c3e0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
c3f0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
c400: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
c410: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
c420: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
c430: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
c440: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
c450: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
c460: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
c470: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
c480: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
c490: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
c4a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c4b0: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
c4c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
c4d0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
c4e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
c4f0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
c500: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
c510: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
c520: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
c530: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
c540: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
c550: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
c560: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ()..*/.static SQ
c570: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
c580: 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62  id vdbeLeave(Vdb
c590: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
c5a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
c5b0: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
c5c0: 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  nDb;.  db = p->d
c5d0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
c5e0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
c5f0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
c600: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
c610: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
c620: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
c630: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
c640: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
c650: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c660: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
c670: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
c680: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
c690: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
c6a0: 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  p){.  if( DbMask
c6b0: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
c6c0: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
c6d0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
c6e0: 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76  se */.  vdbeLeav
c6f0: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e(p);.}.#endif..
c700: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
c710: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
c720: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
c730: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
c740: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
c750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c760: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
c770: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
c780: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
c790: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
c7a0: 20 69 6e 74 20 70 63 2c 20 56 64 62 65 4f 70 20   int pc, VdbeOp 
c7b0: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
c7c0: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
c7d0: 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d  50];.  char zCom
c7e0: 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  [100];.  static 
c7f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
c800: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
c810: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
c820: 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  13s %.2X %s\n";.
c830: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
c840: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
c850: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
c860: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
c870: 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65  of(zPtr));.#ifde
c880: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c890: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
c8a0: 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  .  displayCommen
c8b0: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d  t(pOp, zP4, zCom
c8c0: 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b  , sizeof(zCom));
c8d0: 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d  .#else.  zCom[0]
c8e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f   = 0;.#endif.  /
c8f0: 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74  * NB:  The sqlit
c900: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66  e3OpcodeName() f
c910: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
c920: 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63  mented by code c
c930: 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74  reated.  ** by t
c940: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
c950: 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61   and mkopcodec.a
c960: 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68  wk scripts which
c970: 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a   extract the.  *
c980: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
c990: 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  om the vdbe.c so
c9a0: 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66  urce text */.  f
c9b0: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
c9c0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
c9d0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
c9e0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
c9f0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
ca00: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
ca10: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20  , pOp->p5,.     
ca20: 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c   zCom.  );.  ffl
ca30: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
ca40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
ca50: 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f  alize an array o
ca60: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e  f N Mem element.
ca70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca80: 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d  initMemArray(Mem
ca90: 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69   *p, int N, sqli
caa0: 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61  te3 *db, u16 fla
cab0: 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e  gs){.  while( (N
cac0: 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  --)>0 ){.    p->
cad0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e  db = db;.    p->
cae0: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
caf0: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
cb00: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
cb10: 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70  E_DEBUG.    p->p
cb20: 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23  ScopyFrom = 0;.#
cb30: 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20  endif.    p++;. 
cb40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
cb50: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
cb60: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
cb70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
cb80: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
cb90: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
cba0: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20  if( p && N ){.  
cbb0: 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70    Mem *pEnd = &p
cbc0: 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [N];.    sqlite3
cbd0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
cbe0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
cbf0: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
cc00: 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
cc10: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
cc20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
cc30: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
cc40: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
cc50: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72  <pEnd );.      r
cc60: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
cc70: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72   do{.      asser
cc80: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
cc90: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
cca0: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73  ].db );.      as
ccb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
ccc0: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
ccd0: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
cce0: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
ccf0: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
cd00: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
cd10: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
cd20: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
cd30: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
cd40: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
cd50: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
cd60: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
cd70: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
cd80: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
cd90: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
cda0: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
cdb0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
cdc0: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
cdd0: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
cde0: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
cdf0: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
ce00: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
ce10: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
ce20: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
ce30: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
ce40: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
ce50: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
ce60: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
ce70: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
ce80: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
ce90: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
cea0: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
ceb0: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
cec0: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
ced0: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
cee0: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
cef0: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
cf00: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
cf10: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
cf20: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
cf30: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
cf40: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
cf50: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
cf60: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
cf70: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
cf80: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
cf90: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
cfa0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
cfb0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
cfc0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
cfd0: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74  M_Agg );.      t
cfe0: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
cff0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
d000: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d010: 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69 74 65 33 56  ->xDel==sqlite3V
d020: 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 20 29  dbeFrameMemDel )
d030: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
d040: 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45  lags&(MEM_Agg|ME
d050: 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20  M_Dyn) ){.      
d060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
d070: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
d080: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
d090: 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
d0a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d0b0: 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  NN(db, p->zMallo
d0c0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  c);.        p->s
d0d0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
d0e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
d0f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
d100: 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ined;.    }while
d110: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
d120: 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
d130: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
d140: 20 56 65 72 69 66 79 20 74 68 61 74 20 70 46 72   Verify that pFr
d150: 61 6d 65 20 69 73 20 61 20 76 61 6c 69 64 20 56  ame is a valid V
d160: 64 62 65 46 72 61 6d 65 20 70 6f 69 6e 74 65 72  dbeFrame pointer
d170: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
d180: 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 64 20 66  f it is.** and f
d190: 61 6c 73 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  alse if somethin
d1a0: 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  g is wrong..**.*
d1b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d1c0: 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75  s intended for u
d1d0: 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  se inside of ass
d1e0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
d1f0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71   only..*/.int sq
d200: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49 73  lite3VdbeFrameIs
d210: 56 61 6c 69 64 28 56 64 62 65 46 72 61 6d 65 20  Valid(VdbeFrame 
d220: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69 66 28 20  *pFrame){.  if( 
d230: 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65 4d 61  pFrame->iFrameMa
d240: 67 69 63 21 3d 53 51 4c 49 54 45 5f 46 52 41 4d  gic!=SQLITE_FRAM
d250: 45 5f 4d 41 47 49 43 20 29 20 72 65 74 75 72 6e  E_MAGIC ) return
d260: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
d270: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
d280: 20 54 68 69 73 20 69 73 20 61 20 64 65 73 74 72   This is a destr
d290: 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65 6d 20 6f  uctor on a Mem o
d2a0: 62 6a 65 63 74 20 28 77 68 69 63 68 20 69 73 20  bject (which is 
d2b0: 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c 69 74 65  really an sqlite
d2c0: 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74 68 61 74  3_value).** that
d2d0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 46 72 61   deletes the Fra
d2e0: 6d 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  me object that i
d2f0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  s attached to it
d300: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a   as a blob..**.*
d310: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
d320: 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74 65 20 74  oes not delete t
d330: 68 65 20 46 72 61 6d 65 20 72 69 67 68 74 20 61  he Frame right a
d340: 77 61 79 2e 20 20 49 74 20 6d 65 72 65 6c 79 20  way.  It merely 
d350: 61 64 64 73 20 74 68 65 0a 2a 2a 20 66 72 61 6d  adds the.** fram
d360: 65 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 66  e to a list of f
d370: 72 61 6d 65 73 20 74 6f 20 62 65 20 64 65 6c 65  rames to be dele
d380: 74 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62  ted when the Vdb
d390: 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76 6f 69 64  e halts..*/.void
d3a0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
d3b0: 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20 2a 70 41  eMemDel(void *pA
d3c0: 72 67 29 7b 0a 20 20 56 64 62 65 46 72 61 6d 65  rg){.  VdbeFrame
d3d0: 20 2a 70 46 72 61 6d 65 20 3d 20 28 56 64 62 65   *pFrame = (Vdbe
d3e0: 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a 20 20 61  Frame*)pArg;.  a
d3f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
d400: 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 70  beFrameIsValid(p
d410: 46 72 61 6d 65 29 20 29 3b 0a 20 20 70 46 72 61  Frame) );.  pFra
d420: 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 46  me->pParent = pF
d430: 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61  rame->v->pDelFra
d440: 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 76 2d  me;.  pFrame->v-
d450: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 46 72  >pDelFrame = pFr
d460: 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  ame;.}.../*.** D
d470: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
d480: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
d490: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
d4a0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
d4b0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
d4c0: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
d4d0: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
d4e0: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
d4f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
d500: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
d510: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
d520: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
d530: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
d540: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
d550: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
d560: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
d570: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
d580: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
d590: 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28  dbeFrameIsValid(
d5a0: 70 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p) );.  for(i=0;
d5b0: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
d5c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d5d0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
d5e0: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
d5f0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
d600: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
d610: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
d620: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
d630: 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62  AuxData(p->v->db
d640: 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
d650: 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  -1, 0);.  sqlite
d660: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
d670: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
d680: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d690: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
d6a0: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
d6b0: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
d6c0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
d6d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
d6e0: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
d6f0: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
d700: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
d710: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
d720: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
d730: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
d740: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
d750: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
d760: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
d770: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
d780: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
d790: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
d7a0: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
d7b0: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
d7c0: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
d7d0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
d7e0: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
d7f0: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
d800: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
d810: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
d820: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
d830: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
d840: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
d850: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
d860: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
d870: 20 32 30 31 38 2d 30 34 2d 32 34 3a 20 20 49 6e   2018-04-24:  In
d880: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 6d   p->explain==2 m
d890: 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69 74  ode, the OP_Init
d8a0: 20 6f 70 63 6f 64 65 73 20 6f 66 20 74 72 69 67   opcodes of trig
d8b0: 67 65 72 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  gers.** are also
d8c0: 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68 61 74 20   shown, so that 
d8d0: 74 68 65 20 62 6f 75 6e 64 61 72 69 65 73 20 62  the boundaries b
d8e0: 65 74 77 65 65 6e 20 74 68 65 20 6d 61 69 6e 20  etween the main 
d8f0: 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a 20 65  program and.** e
d900: 61 63 68 20 74 72 69 67 67 65 72 20 61 72 65 20  ach trigger are 
d910: 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  clear..**.** Whe
d920: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
d930: 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20   first the main 
d940: 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65  program is liste
d950: 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a  d, then each of.
d960: 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73  ** the trigger s
d970: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c  ubprograms are l
d980: 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65  isted one by one
d990: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d9a0: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
d9b0: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
d9c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
d9d0: 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  E */.){.  int nR
d9e0: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da00: 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20  * Stop when row 
da10: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68  count reaches th
da20: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  is */.  int nSub
da30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da50: 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64  Number of sub-vd
da60: 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20  bes seen so far 
da70: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
da80: 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20  **apSub = 0;    
da90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
daa0: 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  ay of sub-vdbes 
dab0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d  */.  Mem *pSub =
dac0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
dad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
dae0: 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72  ory cell hold ar
daf0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20  ray of subprogs 
db00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
db10: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
db20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
db30: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
db40: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  tion */.  int i;
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
db80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
db90: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
dba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
dbb0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
dbc0: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
dbd0: 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  m[1];           
dbe0: 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f    /* First Mem o
dbf0: 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  f result set */.
dc00: 20 20 69 6e 74 20 62 4c 69 73 74 53 75 62 70 72    int bListSubpr
dc10: 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61 69  ogs = (p->explai
dc20: 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c 61  n==1 || (db->fla
dc30: 67 73 20 26 20 53 51 4c 49 54 45 5f 54 72 69 67  gs & SQLITE_Trig
dc40: 67 65 72 45 51 50 29 21 3d 30 29 3b 0a 20 20 4f  gerEQP)!=0);.  O
dc50: 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20 61  p *pOp = 0;..  a
dc60: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
dc70: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
dc80: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
dc90: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
dca0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
dcb0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
dcc0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
dcd0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
dce0: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
dcf0: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
dd00: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
dd10: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
dd20: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
dd30: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
dd40: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
dd50: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
dd60: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
dd70: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
dd80: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
dd90: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
dda0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
ddb0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
ddc0: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
ddd0: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
dde0: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
ddf0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
de00: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
de10: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
de20: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
de30: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
de40: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
de50: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
de60: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
de70: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
de80: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
de90: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
dea0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
deb0: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
dec0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
ded0: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
dee0: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
def0: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
df00: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
df10: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
df20: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
df30: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
df40: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
df50: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
df60: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
df70: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
df80: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
df90: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
dfa0: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
dfb0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
dfc0: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
dfd0: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
dfe0: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
dff0: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
e000: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
e010: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
e020: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
e030: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
e040: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
e050: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
e060: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
e070: 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 29 7b  bListSubprogs ){
e080: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
e090: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
e0a0: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
e0b0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
e0c0: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
e0d0: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
e0e0: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
e0f0: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
e100: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
e110: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
e120: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
e130: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
e140: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
e150: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
e160: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
e170: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
e180: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
e190: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
e1a0: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
e1b0: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
e1c0: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
e1d0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
e1e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
e1f0: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
e200: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
e210: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
e220: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
e230: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
e240: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
e250: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
e260: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
e270: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
e280: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
e290: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
e2a0: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
e2b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
e2c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
e2d0: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
e2e0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
e2f0: 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20 4c 6f  while(1){  /* Lo
e300: 6f 70 20 65 78 69 74 73 20 76 69 61 20 62 72 65  op exits via bre
e310: 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d 20 70 2d  ak */.    i = p-
e320: 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69  >pc++;.    if( i
e330: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  >=nRow ){.      
e340: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
e350: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  K;.      rc = SQ
e360: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
e370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e380: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
e390: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
e3a0: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
e3b0: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
e3c0: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
e3d0: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
e3e0: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
e3f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
e400: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
e410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
e420: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
e430: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
e440: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
e450: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
e460: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
e470: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
e480: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
e490: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
e4a0: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
e4b0: 20 20 20 61 73 73 65 72 74 28 20 61 70 53 75 62     assert( apSub
e4c0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
e4d0: 65 72 74 28 20 6e 53 75 62 3e 30 20 29 3b 0a 20  ert( nSub>0 );. 
e4e0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
e4f0: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
e500: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
e510: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
e520: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e530: 28 20 69 3c 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f  ( i<apSub[j]->nO
e540: 70 20 7c 7c 20 6a 2b 31 3c 6e 53 75 62 20 29 3b  p || j+1<nSub );
e550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e560: 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e  Op = &apSub[j]->
e570: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20  aOp[i];.    }.. 
e580: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
e590: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
e5a0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
e5b0: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
e5c0: 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 61 20  at has.    ** a 
e5d0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
e5e0: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
e5f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e600: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
e610: 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65 70 74  rams.    ** kept
e620: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
e630: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
e640: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
e650: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
e660: 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ram.    ** has n
e670: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
e680: 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  seen..    */.   
e690: 20 69 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f   if( bListSubpro
e6a0: 67 73 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70  gs && pOp->p4typ
e6b0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
e6c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
e6d0: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
e6e0: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
e6f0: 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  *);.      int j;
e700: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
e710: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
e720: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
e730: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
e740: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
e750: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e760: 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  j==nSub ){.     
e770: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
e780: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
e790: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
e7a0: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
e7b0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
e7c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
e7d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
e7e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
e7f0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e800: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
e810: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
e820: 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61 70 53  ->z;.        apS
e830: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
e840: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
e850: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
e860: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
e870: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
e880: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
e890: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
e8a0: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d      nRow += pOp-
e8b0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  >p4.pProgram->nO
e8c0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
e8d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
e8e0: 61 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b 0a 20  ain<2 ) break;. 
e8f0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
e900: 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de==OP_Explain )
e910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
e920: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
e930: 49 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e 31 20  Init && p->pc>1 
e940: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
e950: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e960: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  K ){.    if( db-
e970: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
e980: 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  d ){.      p->rc
e990: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
e9a0: 55 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  UPT;.      rc = 
e9b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
e9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
e9d0: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
e9e0: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
e9f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ea00: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 20  char *zP4;.     
ea10: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
ea20: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =1 ){.        pM
ea30: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ea40: 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  Int;.        pMe
ea50: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
ea80: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
ea90: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  .        pMem++;
eaa0: 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 70 4d  .    .        pM
eab0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
eac0: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
ead0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
eae0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
eaf0: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
eb00: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
eb10: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
eb20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eb30: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
eb40: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
eb50: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
eb60: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
eb70: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
eb80: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
eb90: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20    pMem++;.      
eba0: 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  }..      pMem->f
ebb0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
ebc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
ebd0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
ec00: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
ec10: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ec20: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
ec30: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
ec40: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec60: 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P2 */.      pMem
ec70: 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ++;..      pMem-
ec80: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ec90: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
eca0: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
ecd0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
ece0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
ecf0: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
ed00: 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20  size(pMem, 100) 
ed10: 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20  ){ /* P4 */.    
ed20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
ed30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ed40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ed50: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
ed60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
ed70: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ed80: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
ed90: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
eda0: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
edb0: 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  , pMem->szMalloc
edc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  );.      if( zP4
edd0: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
ede0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30       pMem->n = 0
edf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ee00: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
ee10: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
ee20: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
ee30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ee40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
ee50: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
ee60: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
ee70: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
ee80: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
ee90: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
eea0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 7d 0a 20  _UTF8;.      }. 
eeb0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
eec0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
eed0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  in==1 ){.       
eee0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
eef0: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
ef00: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
ef10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ef20: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
ef30: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  led );.         
ef40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
ef50: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
ef60: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
ef70: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
ef80: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
ef90: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
efa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
efb0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
efc0: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
efd0: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
efe0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
eff0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
f000: 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a          pMem++;.
f010: 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
f020: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
f030: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
f040: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
f050: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
f060: 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29  ize(pMem, 500) )
f070: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
f080: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
f090: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
f0a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f0b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
f0c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    }.        pMem
f0d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
f0e0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
f0f0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
f100: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
f110: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
f120: 35 30 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  500);.        pM
f130: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
f140: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
f150: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f160: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
f190: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f1a0: 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  .      p->nResCo
f1b0: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
f1c0: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
f1d0: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
f1e0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
f1f0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
f200: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72  LITE_OK;.      r
f210: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
f220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f230: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
f240: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
f250: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
f260: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
f270: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
f280: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
f290: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
f2a0: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
f2b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
f2c0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
f2d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
f2e0: 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  *z = 0;.  if( p-
f2f0: 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d  >zSql ){.    z =
f300: 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73   p->zSql;.  }els
f310: 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20  e if( p->nOp>=1 
f320: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62  ){.    const Vdb
f330: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
f340: 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  Op[0];.    if( p
f350: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
f360: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
f370: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  !=0 ){.      z =
f380: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
f390: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
f3a0: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
f3b0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
f3c0: 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53  f( z ) printf("S
f3d0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
f3e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
f3f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f400: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
f410: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
f420: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
f430: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
f440: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
f450: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
f460: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f470: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
f480: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
f490: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
f4a0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
f4b0: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
f4c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f4d0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
f4e0: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
f4f0: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
f500: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
f510: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
f520: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
f530: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
f540: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
f550: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
f560: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
f570: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
f580: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
f590: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
f5a0: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
f5b0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
f5c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
f5d0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
f5e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
f5f0: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
f600: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
f610: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
f620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f630: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
f640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f650: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
f660: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
f670: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
f680: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
f690: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
f6a0: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
f6b0: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
f6c0: 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
f6d0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65  f this object de
f6e0: 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d  scribes bulk mem
f6f0: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
f700: 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63  r use.** by subc
f710: 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70  omponents of a p
f720: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
f730: 74 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c  t.  Space is all
f740: 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66  ocated out.** of
f750: 20 61 20 52 65 75 73 61 62 6c 65 53 70 61 63 65   a ReusableSpace
f760: 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20 61   object by the a
f770: 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74  llocSpace() rout
f780: 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74  ine below..*/.st
f790: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
f7a0: 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63  ce {.  u8 *pSpac
f7b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
f7c0: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
f7d0: 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  y */.  sqlite3_i
f7e0: 6e 74 36 34 20 6e 46 72 65 65 3b 20 20 20 2f 2a  nt64 nFree;   /*
f7f0: 20 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   Bytes of availa
f800: 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ble memory */.  
f810: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e  sqlite3_int64 nN
f820: 65 65 64 65 64 3b 20 2f 2a 20 54 6f 74 61 6c 20  eeded; /* Total 
f830: 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64  bytes that could
f840: 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
f850: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20  d */.};../* Try 
f860: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74  to allocate nByt
f870: 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74  e bytes of 8-byt
f880: 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d  e aligned bulk m
f890: 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a  emory for pBuf.*
f8a0: 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61  * from the Reusa
f8b0: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e  bleSpace object.
f8c0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
f8d0: 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
f8e0: 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e  ted.** memory on
f8f0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e   success.  If in
f900: 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72  sufficient memor
f910: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  y is available i
f920: 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c  n the.** Reusabl
f930: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69  eSpace object, i
f940: 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73  ncrease the Reus
f950: 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65  ableSpace.nNeede
f960: 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68  d.** value by th
f970: 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20  e amount needed 
f980: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
f990: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69  .**.** If pBuf i
f9a0: 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20  s not initially 
f9b0: 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73  NULL, that means
f9c0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
f9d0: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
f9e0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  been allocated b
f9f0: 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  y a prior call t
fa00: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  o this routine, 
fa10: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  so just return a
fa20: 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66   copy.** of pBuf
fa30: 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61   and leave Reusa
fa40: 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67  bleSpace unchang
fa50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61  ed..**.** This a
fa60: 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c  llocator is empl
fa70: 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73  oyed to repurpos
fa80: 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61  e unused slots a
fa90: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
faa0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79  .** opcode array
fab0: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61   of prepared sta
fac0: 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d  te for other mem
fad0: 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65  ory needs of the
fae0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
faf0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  tement..*/.stati
fb00: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
fb10: 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75  ce(.  struct Reu
fb20: 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20  sableSpace *p,  
fb30: 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61  /* Bulk memory a
fb40: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
fb50: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
fb60: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
fb70: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
fb80: 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c  r to a prior all
fb90: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ocation */.  sql
fba0: 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
fbb0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
fbc0: 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
fbd0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
fbe0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
fbf0: 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29  NMENT(p->pSpace)
fc00: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d   );.  if( pBuf==
fc10: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
fc20: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
fc30: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d      if( nByte <=
fc40: 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20   p->nFree ){.   
fc50: 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e     p->nFree -= n
fc60: 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66  Byte;.      pBuf
fc70: 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d   = &p->pSpace[p-
fc80: 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c  >nFree];.    }el
fc90: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65  se{.      p->nNe
fca0: 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  eded += nByte;. 
fcb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
fcc0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
fcd0: 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b  IGNMENT(pBuf) );
fce0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
fcf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
fd00: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
fd10: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
fd20: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
fd30: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
fd40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fd50: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
fd60: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
fd70: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
fd80: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
fd90: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
fda0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
fdb0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
fdc0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
fdd0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c  BE_MAGIC_INIT ||
fde0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
fdf0: 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a  MAGIC_RESET );..
fe00: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
fe10: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
fe20: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
fe30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
fe40: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
fe50: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
fe60: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
fe70: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
fe80: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
fe90: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
fea0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
feb0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
fec0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
fed0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
fee0: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
fef0: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
ff00: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
ff10: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
ff20: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
ff30: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
ff40: 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  ort;.  p->nChang
ff50: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
ff60: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
ff70: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
ff80: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
ff90: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
ffa0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
ffb0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
ffc0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28  E_PROFILE.  for(
ffd0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
ffe0: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  ++){.    p->aOp[
fff0: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
10000 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
10010 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
10020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
10030 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
10040 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
10050 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
10060 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72  time after.** cr
10070 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75  eating the virtu
10080 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69  al machine.  Thi
10090 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
100a0 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
100b0 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72  ocating register
100c0 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  s and initializi
100d0 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
100e0 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
100f0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
10100 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
10110 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
10120 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
10130 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
10140 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
10150 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10160 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
10170 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65  xactly once on e
10180 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68  ach virtual mach
10190 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ine..** After th
101a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
101b0 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20  lled the VM has 
101c0 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20  been "packaged" 
101d0 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20  and is ready.** 
101e0 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74  to run.  After t
101f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10200 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63  alled, further c
10210 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  alls to .** sqli
10220 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66  te3VdbeAddOp() f
10230 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f  unctions are pro
10240 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72  hibited.  This r
10250 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63  outine disconnec
10260 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66  ts.** the Vdbe f
10270 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62  rom the Parse ob
10280 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64  ject that helped
10290 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20   generate it so 
102a0 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20  that the.** the 
102b0 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20  Vdbe becomes an 
102c0 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69  independent enti
102d0 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65  ty and the Parse
102e0 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a   object can be.*
102f0 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  * destroyed..**.
10300 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  ** Use the sqlit
10310 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70  e3VdbeRewind() p
10320 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74  rocedure to rest
10330 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  ore a virtual ma
10340 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f  chine back.** to
10350 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61   its initial sta
10360 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20  te after it has 
10370 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  been run..*/.voi
10380 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
10390 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
103a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
103b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
103c0 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20  VDBE */.  Parse 
103d0 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20  *pParse         
103e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
103f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29  ing context */.)
10400 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10420 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
10430 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
10440 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20  .  int nVar;    
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
10470 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69  arameters */.  i
10480 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  nt nMem;        
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104a0 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65   Number of VM me
104b0 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a  mory registers *
104c0 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b  /.  int nCursor;
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
104f0 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64  cursors required
10500 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10520 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10530 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73  f arguments in s
10540 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
10550 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10570 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10580 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61  /.  struct Reusa
10590 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20  bleSpace x;     
105a0 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62     /* Reusable b
105b0 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20  ulk memory */.. 
105c0 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
105d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
105e0 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
105f0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
10600 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
10610 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
10620 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  T );.  assert( p
10630 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65  Parse==p->pParse
10640 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
10650 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
10660 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
10670 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
10680 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
10690 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
106a0 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
106b0 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
106c0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
106d0 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63  Arg;.  .  /* Eac
106e0 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20  h cursor uses a 
106f0 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68  memory cell.  Th
10700 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28  e first cursor (
10710 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20  cursor 0) can.  
10720 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77  ** use aMem[0] w
10730 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65  hich is not othe
10740 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68  rwise used by th
10750 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
10760 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   Allocate.  ** s
10770 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
10780 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75  of aMem[] for cu
10790 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61  rsors 1 and grea
107a0 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c  ter..  ** See al
107b0 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
107c0 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
107d0 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  m += nCursor;.  
107e0 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26  if( nCursor==0 &
107f0 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b  & nMem>0 ) nMem+
10800 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72  +;  /* Space for
10810 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66   aMem[0] even if
10820 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20   not used */..  
10830 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
10840 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20  w much reusable 
10850 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61  memory is availa
10860 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ble at the end o
10870 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64  f the.  ** opcod
10880 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65  e array.  This e
10890 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  xtra memory will
108a0 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
108b0 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e  for other elemen
108c0 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ts.  ** of the p
108d0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
108e0 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f  t..  */.  n = RO
108f0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a  UND8(sizeof(Op)*
10900 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20  p->nOp);        
10910 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
10920 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  f opcode memory 
10930 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61  used */.  x.pSpa
10940 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61  ce = &((u8*)p->a
10950 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20  Op)[n];         
10960 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
10970 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f  opcode memory */
10980 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
10990 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
109a0 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78  x.pSpace) );.  x
109b0 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f  .nFree = ROUNDDO
109c0 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70  WN8(pParse->szOp
109d0 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20  Alloc - n);  /* 
109e0 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  Bytes of unused 
109f0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
10a00 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29  rt( x.nFree>=0 )
10a10 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
10a20 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
10a30 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72  (&x.pSpace[x.nFr
10a40 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ee]) );..  resol
10a50 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
10a60 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
10a70 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
10a80 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
10a90 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
10aa0 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
10ab0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
10ac0 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
10ad0 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
10ae0 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64    }.  p->expired
10af0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
10b00 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
10b10 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
10b20 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
10b30 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f  located in one o
10b40 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  r two.  ** passe
10b50 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
10b60 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
10b70 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65   reuse unused me
10b80 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a  mory at the .  *
10b90 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  * end of the opc
10ba0 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77  ode array.  If w
10bb0 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
10bc0 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f  satisfy all memo
10bd0 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d  ry.  ** requirem
10be0 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20  ents by reusing 
10bf0 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
10c00 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20   tail, then the 
10c10 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73  second.  ** pass
10c20 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68   will fill in th
10c30 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e  e remainder usin
10c40 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79  g a fresh memory
10c50 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
10c60 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77   **.  ** This tw
10c70 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
10c80 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
10c90 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
10ca0 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a  ssible from.  **
10cb0 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65   the leftover me
10cc0 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20  mory at the end 
10cd0 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
10ce0 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73  ray.  This can s
10cf0 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
10d00 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
10d10 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
10d20 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
10d30 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
10d40 0a 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30  .  x.nNeeded = 0
10d50 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c  ;.  p->aMem = al
10d60 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
10d70 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
10d80 29 3b 0a 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  );.  p->aVar = a
10d90 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c  llocSpace(&x, 0,
10da0 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
10db0 29 29 3b 0a 20 20 70 2d 3e 61 70 41 72 67 20 3d  ));.  p->apArg =
10dc0 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10dd0 30 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  0, nArg*sizeof(M
10de0 65 6d 2a 29 29 3b 0a 20 20 70 2d 3e 61 70 43 73  em*));.  p->apCs
10df0 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
10e00 78 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69  x, 0, nCursor*si
10e10 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
10e20 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
10e30 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
10e40 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e  ANSTATUS.  p->an
10e50 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
10e60 65 28 26 78 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a  e(&x, 0, p->nOp*
10e70 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
10e80 6e 64 69 66 0a 20 20 69 66 28 20 78 2e 6e 4e 65  ndif.  if( x.nNe
10e90 65 64 65 64 20 29 7b 0a 20 20 20 20 78 2e 70 53  eded ){.    x.pS
10ea0 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20  pace = p->pFree 
10eb0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
10ec0 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65  cRawNN(db, x.nNe
10ed0 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72  eded);.    x.nFr
10ee0 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a  ee = x.nNeeded;.
10ef0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
10f00 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
10f10 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
10f20 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
10f30 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
10f40 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d  (Mem));.      p-
10f50 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
10f60 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20  ce(&x, p->aVar, 
10f70 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
10f80 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  );.      p->apAr
10f90 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  g = allocSpace(&
10fa0 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  x, p->apArg, nAr
10fb0 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b  g*sizeof(Mem*));
10fc0 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20  .      p->apCsr 
10fd0 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
10fe0 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73   p->apCsr, nCurs
10ff0 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
11000 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20  rsor*));.#ifdef 
11010 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11020 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
11030 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
11040 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
11050 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
11060 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
11070 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
11080 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70  .  p->pVList = p
11090 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20  Parse->pVList;. 
110a0 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
110b0 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
110c0 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
110d0 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  lain;.  if( db->
110e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
110f0 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b      p->nVar = 0;
11100 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
11110 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  = 0;.    p->nMem
11120 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
11130 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
11140 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e  nCursor;.    p->
11150 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
11160 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  ar;.    initMemA
11170 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56  rray(p->aVar, nV
11180 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  ar, db, MEM_Null
11190 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  );.    p->nMem =
111a0 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d   nMem;.    initM
111b0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
111c0 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55   nMem, db, MEM_U
111d0 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d  ndefined);.    m
111e0 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20  emset(p->apCsr, 
111f0 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
11200 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
11210 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11220 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
11230 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74  TATUS.    memset
11240 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70  (p->anExec, 0, p
11250 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
11260 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ));.#endif.  }. 
11270 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
11280 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
11290 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
112a0 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
112b0 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
112c0 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
112d0 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
112e0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
112f0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
11300 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
11310 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
11320 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
11330 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
11340 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d  sert( pCx->pBtx=
11350 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54  =0 || pCx->eCurT
11360 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
11370 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  EE );.  switch( 
11380 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b  pCx->eCurType ){
11390 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
113a0 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20  E_SORTER: {.    
113b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
113c0 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
113d0 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pCx);.      brea
113e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
113f0 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a  e CURTYPE_BTREE:
11400 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78   {.      if( pCx
11410 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  ->isEphemeral ){
11420 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78  .        if( pCx
11430 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33  ->pBtx ) sqlite3
11440 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
11450 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  pBtx);.        /
11460 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
11470 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
11480 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
11490 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
114a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
114b0 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
114c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
114d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d      assert( pCx-
114e0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
114f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11500 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
11510 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  r(pCx->uc.pCurso
11520 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
11530 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
11540 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11550 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
11560 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
11570 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
11580 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
11590 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d  or *pVCur = pCx-
115a0 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20  >uc.pVCur;.     
115b0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
115c0 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
115d0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70   pVCur->pVtab->p
115e0 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73  Module;.      as
115f0 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74  sert( pVCur->pVt
11600 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ab->nRef>0 );.  
11610 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62      pVCur->pVtab
11620 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
11630 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
11640 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72  pVCur);.      br
11650 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
11660 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  f.  }.}../*.** C
11670 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
11680 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
11690 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  frame..*/.static
116a0 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f   void closeCurso
116b0 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a  rsInFrame(Vdbe *
116c0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
116d0 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
116e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
116f0 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
11700 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
11710 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
11720 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
11730 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
11740 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
11750 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
11760 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
11770 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
11780 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11790 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
117a0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
117b0 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
117c0 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
117d0 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
117e0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
117f0 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
11800 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
11810 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
11820 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
11830 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
11840 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
11850 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
11860 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
11870 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
11880 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75  me->v;.  closeCu
11890 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b  rsorsInFrame(v);
118a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
118b0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
118c0 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65  TATUS.  v->anExe
118d0 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78  c = pFrame->anEx
118e0 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e  ec;.#endif.  v->
118f0 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
11900 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
11910 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
11920 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
11930 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
11940 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
11950 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
11960 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
11970 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
11980 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
11990 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
119a0 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
119b0 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
119c0 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
119d0 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
119e0 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
119f0 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74  bChange;.  sqlit
11a00 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
11a10 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70  ata(v->db, &v->p
11a20 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
11a30 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  v->pAuxData =
11a40 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
11a50 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  a;.  pFrame->pAu
11a60 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74  xData = 0;.  ret
11a70 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
11a80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
11a90 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
11aa0 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
11ab0 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
11ac0 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
11ad0 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
11ae0 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
11af0 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
11b00 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
11b10 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
11b20 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
11b30 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
11b40 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
11b50 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
11b60 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
11b70 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
11b80 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
11b90 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
11ba0 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
11bb0 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
11bc0 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
11bd0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
11be0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
11bf0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
11c00 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
11c10 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
11c20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
11c30 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
11c40 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
11c50 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
11c60 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
11c70 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
11c80 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
11c90 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
11ca0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
11cb0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
11cc0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
11cd0 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
11ce0 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
11cf0 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
11d00 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
11d10 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
11d20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
11d30 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
11d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
11d50 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
11d60 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
11d70 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
11d80 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
11d90 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
11da0 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
11db0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
11dc0 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26  AuxData(p->db, &
11dd0 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
11de0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
11df0 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
11e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11e10 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
11e20 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
11e30 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
11e40 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
11e50 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
11e60 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
11e70 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
11e80 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
11e90 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
11ea0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
11eb0 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
11ec0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
11ed0 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
11ee0 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
11ef0 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
11f00 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
11f10 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
11f20 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
11f30 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
11f40 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11f50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
11f60 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65  b;..  if( p->nRe
11f70 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72  sColumn ){.    r
11f80 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
11f90 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
11fa0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
11fb0 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E_N);.    sqlite
11fc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
11fd0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ColName);.  }.  
11fe0 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
11ff0 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
12000 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
12010 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
12020 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  ->aColName = (Me
12030 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
12040 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
12050 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
12060 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
12070 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e  0 ) return;.  in
12080 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  itMemArray(p->aC
12090 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d  olName, n, db, M
120a0 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  EM_Null);.}../*.
120b0 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
120c0 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
120d0 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
120e0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
120f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
12100 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
12110 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
12120 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
12130 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
12140 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
12150 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
12160 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
12170 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
12180 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
12190 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
121a0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
121b0 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
121c0 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
121d0 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
121e0 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
121f0 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
12200 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
12210 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
12220 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
12230 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
12240 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
12250 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
12260 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
12270 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
12280 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
122a0 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
122b0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
122c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
122d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
122e0 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
122f0 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
12300 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
12330 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
12340 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
12350 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
12360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12370 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
12380 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
12390 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
123a0 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
123b0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
123c0 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
123d0 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
123e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
123f0 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
12400 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
12410 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
12420 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
12430 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
12440 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
12450 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
12460 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
12470 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
12480 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
12490 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
124a0 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
124b0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
124c0 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
124d0 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
124e0 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
124f0 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
12500 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
12510 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
12520 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
12530 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
12540 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
12550 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
12560 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
12570 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
12580 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12590 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
125a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
125b0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
125c0 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
125d0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
125e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
125f0 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
12600 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
12610 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
12620 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
12630 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
12640 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
12650 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
12660 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
12670 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12680 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
12690 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
126a0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
126b0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
126c0 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
126d0 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
126e0 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
126f0 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
12700 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e-transaction.  
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e   ** that are can
12730 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77  didates for a tw
12740 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75  o-phase commit u
12750 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20  sing a.         
12760 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73            ** mas
12770 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter-journal */. 
12780 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12790 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
127a0 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
127b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
127c0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
127d0 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
127e0 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
127f0 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
12800 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
12810 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
12820 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
12830 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
12840 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
12850 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
12860 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
12870 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
12880 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
12890 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
128a0 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
128b0 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
128c0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
128d0 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
128e0 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
128f0 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
12900 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
12910 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
12920 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
12930 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
12940 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
12950 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
12960 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
12970 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
12980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
12990 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
129a0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
129b0 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
129c0 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
129d0 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
129e0 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
129f0 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
12a00 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
12a10 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
12a20 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
12a30 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
12a40 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
12a50 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
12a60 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
12a70 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
12a80 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
12a90 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
12aa0 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
12ab0 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
12ac0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
12ad0 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
12ae0 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
12af0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
12b00 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
12b10 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
12b20 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
12b30 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
12b40 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
12b50 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
12b60 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
12b70 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62  r or not a datab
12b80 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61  ase might need a
12b90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12ba0 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20  depends upon.   
12bb0 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61     ** its journa
12bc0 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74  l mode (among ot
12bd0 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68  her things).  Th
12be0 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d  is matrix determ
12bf0 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ines which.     
12c00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65   ** journal mode
12c10 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a  s use a master j
12c20 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68  ournal and which
12c30 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20   do not */.     
12c40 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
12c50 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b   aMJNeeded[] = {
12c60 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45  .        /* DELE
12c70 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20  TE   */  1,.    
12c80 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20      /* PERSIST  
12c90 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
12ca0 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30  * OFF       */ 0
12cb0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  ,.        /* TRU
12cc0 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20  NCATE  */ 1,.   
12cd0 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20       /* MEMORY  
12ce0 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
12cf0 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20  /* WAL       */ 
12d00 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
12d10 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
12d20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63    /* Pager assoc
12d30 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a  iated with pBt *
12d40 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  /.      needXcom
12d50 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  mit = 1;.      s
12d60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12d70 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61  (pBt);.      pPa
12d80 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
12d90 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
12da0 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
12db0 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  i].safety_level!
12dc0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
12dd0 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26  US_OFF.       &&
12de0 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74   aMJNeeded[sqlit
12df0 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
12e00 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20  lMode(pPager)]. 
12e10 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12e20 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50 61  PagerIsMemdb(pPa
12e30 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ger)==0.      ){
12e40 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
12e50 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i!=1 );.      
12e60 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20    nTrans++;.    
12e70 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
12e80 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
12e90 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
12ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
12eb0 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
12ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12ee0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
12ef0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
12f00 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
12f10 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
12f20 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
12f30 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
12f40 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
12f50 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
12f60 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
12f70 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
12f80 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
12f90 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
12fa0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
12fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
12fc0 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
12fd0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
12fe0 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
12ff0 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
13000 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
13010 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
13020 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
13030 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
13040 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
13050 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
13060 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
13070 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
13080 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
13090 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
130a0 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
130b0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
130c0 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
130d0 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
130e0 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
130f0 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
13100 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
13110 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
13120 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
13130 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
13140 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
13150 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
13160 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
13170 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
13180 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
13190 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
131a0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
131b0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
131c0 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
131d0 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
131e0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
131f0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
13200 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
13210 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
13220 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
13230 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
13240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13250 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
13260 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
13270 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
13280 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
13290 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
132a0 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
132b0 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
132c0 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
132d0 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
132e0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
132f0 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
13300 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
13310 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
13320 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
13330 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
13340 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
13350 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
13360 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
13370 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
13380 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
13390 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
133a0 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
133b0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
133c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
133d0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
133e0 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
133f0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
13400 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
13410 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
13420 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
13430 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
13440 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
13450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
13460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13470 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
13480 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
13490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
134a0 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
134b0 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
134c0 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
134d0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
134e0 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
134f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
13500 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
13510 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13520 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
13530 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
13540 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
13550 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
13560 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
13570 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
13580 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61  b->pVfs;.    cha
13590 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
135a0 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
135b0 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
135c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
135d0 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
135e0 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
135f0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
13600 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
13610 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
13620 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
13630 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
13640 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
13650 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
13660 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
13670 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
13680 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
13690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
136a0 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
136b0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
136c0 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
136d0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
136e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
136f0 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
13700 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
13710 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
13720 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
13730 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
13740 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
13750 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
13760 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
13770 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
13780 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
13790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
137a0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
137b0 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
137c0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
137d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
137e0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
137f0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
13800 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13810 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13820 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
13830 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
13840 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
13850 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
13860 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
13870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13880 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
13890 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
138a0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
138b0 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
138c0 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
138d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
138e0 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
138f0 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
13900 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13920 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
13930 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
13940 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
13950 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
13960 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
13970 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
13980 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
13990 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
139a0 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
139b0 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
139c0 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
139d0 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
139e0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
139f0 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
13a00 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
13a10 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
13a20 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
13a30 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
13a40 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
13a50 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
13a60 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
13a70 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
13a80 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
13a90 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
13aa0 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
13ab0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13ad0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
13ae0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
13af0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13b00 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
13b10 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
13b20 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
13b30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
13b40 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
13b50 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
13b60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13b70 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
13b80 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
13b90 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
13ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13bc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
13bd0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
13be0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
13bf0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
13c00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
13c10 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
13c20 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
13c30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
13c40 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
13c50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13c60 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
13c70 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
13c80 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
13c90 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
13ca0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13cb0 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
13cc0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
13cd0 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
13ce0 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
13cf0 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
13d00 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
13d10 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
13d20 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
13d30 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
13d40 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
13d50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
13d60 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
13d70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
13d80 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13d90 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
13da0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
13db0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
13dc0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
13dd0 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
13de0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
13df0 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
13e00 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
13e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13e20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
13e30 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
13e40 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
13e50 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
13e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
13e70 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
13e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13e90 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
13ea0 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
13eb0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
13ec0 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
13ed0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
13ee0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
13ef0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
13f00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13f10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
13f20 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
13f30 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
13f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
13f50 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
13f60 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
13f70 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13f80 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
13f90 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13fa0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13fb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
13fc0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
13fd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13fe0 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
13ff0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
14000 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
14010 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
14020 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
14030 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c  .    if( 0==(sql
14040 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
14050 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
14060 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
14070 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
14080 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
14090 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
140a0 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
140b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
140c0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
140d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
140e0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
140f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
14100 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
14110 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
14120 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
14130 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
14140 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
14150 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
14160 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
14170 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
14180 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
14190 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
141a0 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
141b0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
141c0 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
141d0 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
141e0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
141f0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
14200 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
14210 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14220 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
14230 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
14240 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
14250 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
14260 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
14270 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
14280 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
14290 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
142a0 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
142b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
142c0 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
142d0 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
142e0 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
142f0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
14300 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
14310 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
14320 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
14330 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
14340 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
14350 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
14360 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
14370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
14380 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
14390 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
143a0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
143b0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
143c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
143d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
143e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
143f0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
14400 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
14410 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
14420 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
14430 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
14440 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
14450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14460 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14470 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
14480 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
14490 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
144a0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
144b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
144c0 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
144d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
144e0 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
144f0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
14500 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
14510 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
14520 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
14530 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
14540 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
14550 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
14560 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
14570 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
14580 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
14590 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
145a0 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
145b0 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
145c0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
145d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
145e0 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
145f0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
14600 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
14610 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
14620 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
14630 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
14640 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14650 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
14660 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
14670 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
14680 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
14690 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
146a0 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
146b0 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
146c0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
146d0 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
146e0 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
146f0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
14700 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
14710 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
14720 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
14730 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
14740 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
14750 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
14760 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
14770 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
14780 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
14790 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
147a0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
147b0 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
147c0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
147d0 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
147e0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
147f0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
14800 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
14810 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
14820 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
14830 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
14840 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
14850 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
14860 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
14870 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
14880 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
14890 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
148a0 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
148b0 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
148c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
148d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
148e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
148f0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
14900 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
14910 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
14920 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
14930 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
14940 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
14950 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
14960 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
14970 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
14980 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
14990 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
149a0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
149b0 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
149c0 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
149d0 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
149e0 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
149f0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
14a00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
14a10 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
14a20 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
14a30 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
14a40 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
14a50 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
14a60 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
14a70 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
14a80 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
14a90 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
14aa0 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
14ab0 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
14ac0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
14ad0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
14ae0 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
14af0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
14b00 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
14b10 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
14b20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
14b30 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
14b40 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
14b50 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
14b60 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
14b70 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
14b80 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
14b90 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
14ba0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
14bb0 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
14bc0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
14bd0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
14be0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
14bf0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
14c00 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
14c10 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
14c20 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
14c30 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
14c40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
14c50 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
14c60 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
14c70 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
14c80 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
14c90 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
14ca0 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
14cb0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14cc0 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
14cd0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
14ce0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
14cf0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
14d00 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14d10 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
14d20 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
14d30 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
14d40 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
14d50 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
14d60 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
14d70 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
14d80 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
14d90 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
14da0 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  _OK..*/.static S
14db0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
14dc0 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  nt vdbeCloseStat
14dd0 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
14de0 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
14df0 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
14e00 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
14e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
14e20 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  t i;.  const int
14e30 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
14e40 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
14e50 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
14e60 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14e70 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
14e80 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
14e90 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
14ea0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
14eb0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
14ec0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
14ed0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
14ee0 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69  int) );..  for(i
14ef0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
14f00 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63  ++){ .    int rc
14f10 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
14f20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
14f30 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
14f40 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
14f50 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
14f60 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14f70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20   ){.        rc2 
14f80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
14f90 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
14fa0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
14fb0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
14fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14fd0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
14fe0 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  {.        rc2 = 
14ff0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
15000 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
15010 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
15020 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
15030 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
15040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15050 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
15060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15070 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  }.  db->nStateme
15080 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74  nt--;.  p->iStat
15090 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ement = 0;..  if
150a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
150b0 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  ){.    if( eOp==
150c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
150d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
150e0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
150f0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
15100 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
15110 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
15120 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15140 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
15150 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
15160 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
15170 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
15180 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
15190 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
151a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
151b0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
151c0 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
151d0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
151e0 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
151f0 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
15200 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
15210 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
15220 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
15230 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
15240 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
15250 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
15260 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
15270 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
15280 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
15290 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  efCons;.    db->
152a0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
152b0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
152c0 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74  mCons;.  }.  ret
152d0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
152e0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
152f0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
15300 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28   int eOp){.  if(
15310 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65   p->db->nStateme
15320 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
15330 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ent ){.    retur
15340 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  n vdbeCloseState
15350 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20  ment(p, eOp);.  
15360 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15370 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
15380 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15390 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
153a0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
153b0 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
153c0 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
153d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
153e0 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
153f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
15400 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
15410 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
15420 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
15430 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
15440 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
15450 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
15460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15470 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
15480 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
15490 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
154a0 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
154b0 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
154c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
154d0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
154e0 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
154f0 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
15500 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
15510 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
15520 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
15530 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
15540 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
15550 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
15560 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15570 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
15580 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
15590 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
155a0 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
155b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
155c0 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
155d0 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
155e0 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
155f0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
15600 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
15610 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
15620 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
15630 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
15640 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
15650 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
15660 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
15670 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
15680 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
15690 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
156a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
156b0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
156c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
156d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
156e0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
156f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15700 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
15710 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
15720 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
15730 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
15740 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
15750 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
15760 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
15770 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
15780 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
15790 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
157a0 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
157b0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
157c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
157d0 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
157e0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
157f0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
15800 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
15810 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
15820 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
15830 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
15840 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
15850 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
15860 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
15870 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
15880 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
15890 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
158a0 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
158b0 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
158c0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
158d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
158e0 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
158f0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
15900 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
15910 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
15920 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
15930 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
15940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15950 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
15960 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
15990 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
159a0 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
159b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
159c0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
159d0 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
159e0 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
159f0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
15a00 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
15a10 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
15a20 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
15a30 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
15a40 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
15a50 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
15a60 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
15a70 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
15a80 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
15a90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
15aa0 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
15ab0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
15ac0 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
15ad0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
15ae0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
15af0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
15b00 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
15b10 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
15b20 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
15b30 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
15b40 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
15b50 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
15b60 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
15b70 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
15b80 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
15b90 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
15ba0 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
15bb0 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
15bc0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
15bd0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
15be0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
15bf0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
15c00 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
15c10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15c20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
15c30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
15c40 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
15c50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
15c60 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  KPT;.  }.  close
15c70 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
15c80 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
15c90 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
15ca0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
15cb0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
15cc0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
15cd0 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
15ce0 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
15cf0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
15d00 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
15d10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
15d20 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
15d30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
15d40 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
15d50 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
15d60 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
15d70 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
15d80 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
15d90 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
15da0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
15db0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
15dc0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
15dd0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
15de0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
15df0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
15e00 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
15e10 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
15e20 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
15e30 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
15e40 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
15e50 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
15e60 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
15e70 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
15e80 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
15e90 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
15ea0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
15ec0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
15ed0 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
15ee0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
15ef0 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
15f00 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
15f10 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
15f20 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
15f30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
15f40 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
15f50 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
15f60 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
15f70 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
15f80 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
15f90 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
15fa0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
15fb0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
15fc0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
15fd0 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
15fe0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
15ff0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
16000 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
16010 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
16020 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
16030 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
16040 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
16050 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
16060 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
16070 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
16080 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
16090 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
160a0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
160b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
160c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
160d0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
160e0 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
160f0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
16100 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
16110 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
16120 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
16130 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
16140 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
16150 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
16160 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
16170 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
16180 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
16190 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
161a0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
161b0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
161c0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
161d0 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
161e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
161f0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
16200 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
16210 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
16220 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
16230 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
16240 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
16250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16260 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
16270 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
16280 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
16290 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
162a0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
162b0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
162c0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
162d0 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
162e0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
162f0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
16300 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16310 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
16320 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
16330 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
16340 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
16350 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
16360 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
16370 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
16380 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
16390 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
163a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
163b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
163c0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
163d0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
163e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
163f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
16400 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
16410 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
16420 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
16430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16440 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
16450 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16460 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
16470 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
16480 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
16490 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
164a0 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
164b0 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
164c0 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
164d0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
164e0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
164f0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
16500 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
16510 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
16520 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
16530 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
16540 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
16550 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
16560 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
16570 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
16580 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
16590 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
165a0 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
165b0 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
165c0 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
165d0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
165e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
165f0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
16600 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
16610 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
16620 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16630 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
16640 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
16670 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
16680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16690 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
166a0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
166b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
166c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
166d0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
166e0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
166f0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
16700 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
16710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16720 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
16730 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
16740 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
16750 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
16760 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
16770 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
16780 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
16790 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
167a0 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
167b0 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
167c0 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
167d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
167e0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
167f0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
16800 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
16810 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
16820 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
16830 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
16840 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
16850 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
16860 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
16870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16880 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
16890 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
168a0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
168b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
168c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
168d0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
168e0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
168f0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
16900 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
16910 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
16920 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16940 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
16950 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
16960 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
16970 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
16980 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
16990 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49  gs &= ~(u64)SQLI
169a0 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
169b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
169c0 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
169d0 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
169e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
169f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16a00 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16a10 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
16a20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
16a30 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16a40 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
16a50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
16a60 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
16a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
16a80 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16a90 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
16aa0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
16ab0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
16ac0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
16ad0 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
16ae0 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
16af0 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
16b00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
16b10 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
16b20 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
16b30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16b40 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
16b50 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
16b60 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
16b70 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
16b80 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
16b90 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
16ba0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
16bb0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
16bc0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
16bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
16be0 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
16bf0 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
16c00 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
16c10 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
16c20 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
16c30 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
16c40 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
16c50 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
16c60 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
16c70 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
16c80 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
16c90 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
16ca0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
16cb0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
16cc0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
16cd0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
16ce0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
16cf0 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
16d00 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
16d10 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
16d20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
16d30 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
16d40 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
16d50 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
16d60 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
16d70 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
16d80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
16d90 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
16da0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
16db0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
16dc0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
16dd0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
16de0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
16df0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16e00 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
16e10 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
16e20 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
16e30 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
16e40 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
16e50 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
16e60 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
16e70 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
16e80 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
16e90 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16ea0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
16eb0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
16ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16ed0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
16ee0 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
16ef0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
16f00 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
16f10 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
16f20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
16f30 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
16f40 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
16f50 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
16f60 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
16f70 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
16f80 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
16f90 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
16fa0 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
16fb0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
16fc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
16fd0 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
16fe0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
16ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
17000 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
17010 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
17020 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
17030 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
17040 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
17050 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
17060 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
17070 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
17080 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
17090 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
170a0 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
170b0 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
170c0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
170d0 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
170e0 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
170f0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
17100 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
17110 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
17120 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
17130 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
17140 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
17150 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
17160 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
17170 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
17180 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
17190 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
171a0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
171b0 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
171c0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
171d0 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
171e0 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
171f0 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
17200 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17210 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
17220 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
17230 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
17240 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
17250 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
17260 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
17270 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
17280 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
17290 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
172a0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
172b0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
172c0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
172d0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
172e0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
172f0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
17300 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
17310 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
17320 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
17330 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
17340 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
17350 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
17360 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
17370 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
17380 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
17390 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
173a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
173b0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
173c0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
173d0 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
173e0 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
173f0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
17400 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
17410 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
17420 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
17430 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
17440 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
17450 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
17460 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
17470 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
17480 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
17490 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
174a0 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
174b0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
174c0 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
174d0 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
174e0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
174f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
17500 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
17510 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
17520 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
17530 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
17540 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
17550 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
17560 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
17570 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17580 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
17590 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
175a0 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
175b0 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
175c0 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
175d0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
175e0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
175f0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
17600 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
17610 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
17620 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
17630 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
17640 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
17650 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
17660 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
17670 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
17680 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
17690 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
176a0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
176b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
176c0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
176d0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
176e0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
176f0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
17700 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
17710 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
17720 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
17730 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73  Malloc--;.  }els
17740 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29  e if( db->pErr )
17750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
17760 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45  ueSetNull(db->pE
17770 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65  rr);.  }.  db->e
17780 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72  rrCode = rc;.  r
17790 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
177a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
177b0 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
177c0 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
177d0 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
177e0 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
177f0 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
17800 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
17810 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
17820 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
17830 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
17840 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
17850 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
17860 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
17870 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
17880 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
17890 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
178a0 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
178b0 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
178c0 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
178d0 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
178e0 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
178f0 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
17900 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
17910 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
17920 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
17930 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17940 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
17950 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
17960 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
17970 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
17980 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
17990 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
179a0 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
179b0 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
179c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
179d0 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
179e0 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
179f0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
17a00 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
17a10 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
17a20 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
17a30 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
17a40 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
17a50 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
17a60 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
17a70 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
17a80 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
17a90 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
17aa0 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
17ab0 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
17ac0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
17ad0 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
17ae0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
17af0 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
17b00 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
17b10 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
17b20 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
17b30 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
17b40 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
17b50 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
17b60 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
17b70 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
17b80 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
17b90 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
17ba0 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   i;.#endif..  sq
17bb0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
17bc0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
17bd0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
17be0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
17bf0 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
17c00 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
17c10 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
17c20 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
17c30 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
17c40 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
17c50 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
17c60 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
17c70 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
17c80 65 20 56 44 42 45 20 68 61 73 20 62 65 65 6e 20  e VDBE has been 
17c90 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
17ca0 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
17cb0 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
17cc0 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
17cd0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
17ce0 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
17cf0 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
17d00 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
17d10 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
17d20 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
17d30 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
17d40 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
17d50 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
17d60 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
17d70 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
17d80 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
17d90 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
17da0 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
17db0 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
17dc0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
17dd0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
17de0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
17df0 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  r(p);.    if( p-
17e00 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
17e10 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
17e20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
17e30 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
17e40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
17e50 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
17e60 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
17e70 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
17e80 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
17e90 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
17ea0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
17eb0 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
17ec0 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
17ed0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
17ee0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
17ef0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
17f00 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
17f10 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
17f20 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
17f30 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
17f40 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
17f50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  );.  }..  /* Res
17f60 65 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  et register cont
17f70 65 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d  ents and reclaim
17f80 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
17f90 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64  emory..  */.#ifd
17fa0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17fb0 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
17fc0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
17fd0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
17fe0 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
17ff0 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
18000 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
18010 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
18020 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
18030 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
18040 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
18050 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
18060 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
18070 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
18080 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
18090 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
180a0 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
180b0 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
180c0 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
180d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
180e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
180f0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
18100 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
18110 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
18120 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
18130 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69  _DEBUG.  p->nWri
18140 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
18150 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
18160 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
18170 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
18180 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
18190 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
181a0 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
181b0 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
181c0 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
181d0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
181e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
181f0 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
18200 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
18210 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
18220 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18230 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
18240 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
18250 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
18260 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
18270 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20      if( p->zSql 
18280 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
18290 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20  c, pc = 0;.     
182a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
182b0 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
182c0 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d  for(i=0; (c = p-
182d0 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b  >zSql[i])!=0; i+
182e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
182f0 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc=='\n' ) fpr
18300 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
18310 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63  ;.          putc
18320 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
18330 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
18340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
18350 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc!='\n' ) fpr
18360 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
18370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
18380 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
18390 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
183a0 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a  char zHdr[100];.
183b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
183c0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
183d0 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36  zHdr), zHdr, "%6
183e0 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22  u %12llu %8llu "
183f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
18400 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
18410 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
18420 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
18430 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
18440 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
18450 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
18460 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
18470 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
18480 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
18490 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Hdr);.        sq
184a0 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
184b0 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
184c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
184d0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
184e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
184f0 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
18500 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b  DBE_MAGIC_RESET;
18510 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
18520 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
18530 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
18540 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
18550 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
18560 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
18570 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
18580 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
18590 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
185a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
185b0 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
185c0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
185d0 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
185e0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
185f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18600 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
18610 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
18620 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
18630 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
18640 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
18650 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
18660 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
18670 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
18680 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
18690 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
186a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
186b0 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
186c0 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
186d0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
186e0 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
186f0 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
18700 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
18710 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
18720 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
18730 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
18740 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
18750 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
18760 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
18770 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
18780 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
18790 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
187a0 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
187b0 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
187c0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
187d0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
187e0 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
187f0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
18800 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
18810 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
18820 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
18830 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
18840 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
18850 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
18860 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
18870 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
18880 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
18890 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
188a0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
188b0 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
188c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
188d0 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
188e0 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
188f0 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
18900 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
18910 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
18920 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
18930 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
18940 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
18950 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33  eAuxData(sqlite3
18960 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a   *db, AuxData **
18970 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  pp, int iOp, int
18980 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28   mask){.  while(
18990 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
189a0 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
189b0 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
189c0 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
189d0 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20  iAuxOp==iOp.    
189e0 20 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69        && pAux->i
189f0 41 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20  AuxArg>=0.      
18a00 20 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41      && (pAux->iA
18a10 75 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61  uxArg>31 || !(ma
18a20 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70  sk & MASKBIT32(p
18a30 41 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29  Aux->iAuxArg))))
18a40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
18a50 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
18a60 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  uxArg==31 );.   
18a70 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
18a80 6c 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20  leteAux ){.     
18a90 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
18aa0 41 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  Aux(pAux->pAux);
18ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
18ac0 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  pp = pAux->pNext
18ad0 41 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Aux;.      sqlit
18ae0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75  e3DbFree(db, pAu
18af0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
18b00 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
18b10 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a  pNextAux;.    }.
18b20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
18b30 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
18b40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
18b50 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
18b60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
18b70 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
18b80 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
18b90 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
18ba0 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
18bb0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
18bc0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
18bd0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
18be0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
18bf0 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
18c00 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
18c10 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
18c20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
18c30 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
18c40 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
18c50 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
18c60 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
18c70 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
18c80 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
18c90 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
18ca0 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
18cb0 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
18cc0 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
18cd0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
18ce0 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
18cf0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
18d00 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
18d10 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
18d20 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
18d30 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
18d40 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
18d50 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
18d60 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
18d70 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
18d80 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
18d90 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
18da0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
18db0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d  ;.  }.  if( p->m
18dc0 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
18dd0 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c  _INIT ){.    rel
18de0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
18df0 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
18e00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18e10 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29  e(db, p->pVList)
18e20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
18e30 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
18e40 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65  );.  }.  vdbeFre
18e50 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
18e60 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
18e70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18e80 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
18e90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18ea0 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69  db, p->zSql);.#i
18eb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18ec0 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73  LE_NORMALIZE.  s
18ed0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18ee0 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 20   p->zNormSql);. 
18ef0 20 7b 0a 20 20 20 20 44 62 6c 71 75 6f 74 65 53   {.    DblquoteS
18f00 74 72 20 2a 70 54 68 69 73 2c 20 2a 70 4e 65 78  tr *pThis, *pNex
18f10 74 3b 0a 20 20 20 20 66 6f 72 28 70 54 68 69 73  t;.    for(pThis
18f20 3d 70 2d 3e 70 44 62 6c 53 74 72 3b 20 70 54 68  =p->pDblStr; pTh
18f30 69 73 3b 20 70 54 68 69 73 3d 70 4e 65 78 74 29  is; pThis=pNext)
18f40 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
18f50 70 54 68 69 73 2d 3e 70 4e 65 78 74 53 74 72 3b  pThis->pNextStr;
18f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
18f70 46 72 65 65 28 64 62 2c 20 70 54 68 69 73 29 3b  Free(db, pThis);
18f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
18f90 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
18fa0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
18fb0 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69  STATUS.  {.    i
18fc0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
18fd0 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69  0; i<p->nScan; i
18fe0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
18ff0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
19000 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  aScan[i].zName);
19010 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19020 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
19030 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  aScan);.  }.#end
19040 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
19050 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
19060 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
19070 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
19080 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
19090 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   *db;..  assert(
190a0 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
190b0 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
190c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
190d0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
190e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
190f0 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
19100 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
19110 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
19120 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
19130 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
19140 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
19150 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
19160 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
19170 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
19180 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
19190 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
191a0 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
191b0 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
191c0 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
191d0 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
191e0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
191f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
19200 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61  cursor "p" has a
19210 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70   pending seek op
19220 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73  eration that has
19230 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a   not yet been.**
19240 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53   carried out.  S
19250 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e  eek the cursor n
19260 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  ow.  If an error
19270 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a   occurs, return.
19280 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
19290 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
192a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
192b0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
192c0 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
192d0 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
192e0 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b  {.  int res, rc;
192f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19300 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  EST.  extern int
19310 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
19320 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
19330 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72  assert( p->defer
19340 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61  redMoveto );.  a
19350 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
19360 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
19370 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
19380 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72  YPE_BTREE );.  r
19390 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
193a0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
193b0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c  ->uc.pCursor, 0,
193c0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
193d0 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  , 0, &res);.  if
193e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
193f0 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29  ;.  if( res!=0 )
19400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19410 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66  ORRUPT_BKPT;.#if
19420 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
19430 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
19440 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
19450 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  .  p->deferredMo
19460 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  veto = 0;.  p->c
19470 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
19480 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75  HE_STALE;.  retu
19490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
194a0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67  ./*.** Something
194b0 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f   has moved curso
194c0 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61  r "p" out of pla
194d0 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72  ce.  Maybe the r
194e0 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69  ow it was.** poi
194f0 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65  nted to was dele
19500 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
19510 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65  er it.  Or maybe
19520 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a   the btree was.*
19530 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57  * rebalanced.  W
19540 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73  hatever the caus
19550 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72  e, try to restor
19560 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61  e "p" to the pla
19570 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70  ce it.** is supp
19580 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  osed to be point
19590 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77  ing.  If the row
195a0 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
195b0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a   from under the.
195c0 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74  ** cursor, set t
195d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
195e0 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77  nt to a NULL row
195f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19600 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
19610 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
19620 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  r(VdbeCursor *p)
19630 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72  {.  int isDiffer
19640 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73  entRow, rc;.  as
19650 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
19660 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
19670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
19680 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
19690 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
196a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
196b0 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
196c0 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  rsor) );.  rc = 
196d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
196e0 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e  orRestore(p->uc.
196f0 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66  pCursor, &isDiff
19700 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e  erentRow);.  p->
19710 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
19720 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
19730 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20   isDifferentRow 
19740 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
19750 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19760 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
19770 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
19780 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
19790 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  .  Restore the c
197a0 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64  ursor.** if need
197b0 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79   be.  Return any
197c0 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20   I/O error from 
197d0 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72  the restore oper
197e0 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
197f0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52  lite3VdbeCursorR
19800 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f  estore(VdbeCurso
19810 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
19820 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
19830 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
19840 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
19850 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
19860 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
19870 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
19880 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
19890 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
198a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
198b0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
198c0 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
198d0 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
198e0 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
198f0 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
19900 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
19910 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
19920 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
19930 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
19940 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
19950 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
19960 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
19970 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
19980 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
19990 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
199a0 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
199b0 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
199c0 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
199d0 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
199e0 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
199f0 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
19a00 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
19a10 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
19a20 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
19a30 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
19a40 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
19a50 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
19a60 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
19a70 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
19a80 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
19a90 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
19aa0 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
19ab0 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
19ac0 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
19ad0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
19ae0 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
19af0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19b00 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
19b10 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
19b20 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
19b30 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29  *pp, int *piCol)
19b40 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
19b50 70 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72  p = *pp;.  asser
19b60 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
19b70 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c  CURTYPE_BTREE ||
19b80 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
19b90 52 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a  RTYPE_PSEUDO );.
19ba0 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
19bb0 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
19bc0 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28  nt iMap;.    if(
19bd0 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28   p->aAltMap && (
19be0 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61  iMap = p->aAltMa
19bf0 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29  p[1+*piCol])>0 )
19c00 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  {.      *pp = p-
19c10 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20  >pAltCursor;.   
19c20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70     *piCol = iMap
19c30 20 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   - 1;.      retu
19c40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19c50 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68    }.    return h
19c60 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
19c70 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66  eto(p);.  }.  if
19c80 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
19c90 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
19ca0 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
19cb0 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
19cc0 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
19cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19ce0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19cf0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
19d00 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
19d10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19d20 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
19d30 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
19d40 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
19d50 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
19d60 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19d70 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
19d80 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
19d90 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
19da0 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
19db0 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
19dc0 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
19dd0 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
19de0 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
19df0 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
19e00 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
19e10 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
19e20 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
19e30 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
19e40 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
19e50 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
19e60 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
19e70 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
19e80 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
19e90 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
19ea0 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
19eb0 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
19ec0 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
19ed0 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
19ee0 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
19ef0 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
19f00 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
19f10 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
19f20 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
19f30 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
19f40 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
19f50 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
19f60 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
19f70 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
19f80 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
19f90 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
19fa0 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
19fb0 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
19fc0 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
19fd0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
19fe0 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
19ff0 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
1a000 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
1a010 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
1a020 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
1a030 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
1a040 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
1a050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
1a060 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1a070 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
1a080 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
1a0b0 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
1a0e0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
1a0f0 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
1a110 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
1a120 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
1a130 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
1a140 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
1a150 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
1a160 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
1a190 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
1a1a0 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
1a1c0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
1a1d0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
1a1e0 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
1a1f0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
1a200 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
1a210 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
1a240 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
1a250 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
1a260 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
1a270 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
1a280 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
1a2b0 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
1a2c0 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a2f0 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
1a300 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
1a310 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
1a320 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
1a330 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
1a340 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
1a350 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
1a360 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
1a370 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
1a380 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
1a390 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
1a3a0 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
1a3b0 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
1a3c0 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
1a3d0 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
1a3e0 74 79 70 65 73 2e 0a 2a 2f 0a 0a 23 69 66 20 30  types..*/..#if 0
1a3f0 20 2f 2a 20 49 6e 6c 69 6e 65 64 20 69 6e 74 6f   /* Inlined into
1a400 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1a410 72 64 20 6f 70 63 6f 64 65 20 2a 2f 0a 2f 2a 0a  rd opcode */./*.
1a420 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
1a430 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
1a440 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
1a450 6e 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  n pMem..**.** Th
1a460 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
1a470 20 63 6f 6e 76 65 72 74 20 61 20 6c 61 72 67 65   convert a large
1a480 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 76 61 6c   MEM_IntReal val
1a490 75 65 20 69 6e 74 6f 20 4d 45 4d 5f 52 65 61 6c  ue into MEM_Real
1a4a0 2e 0a 2a 2a 0a 2a 2a 20 32 30 31 39 2d 30 37 2d  ..**.** 2019-07-
1a4b0 31 31 3a 20 20 54 68 65 20 70 72 69 6d 61 72 79  11:  The primary
1a4c0 20 75 73 65 72 20 6f 66 20 74 68 69 73 20 73 75   user of this su
1a4d0 62 72 6f 75 74 69 6e 65 20 77 61 73 20 74 68 65  broutine was the
1a4e0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 0a 2a   OP_MakeRecord.*
1a4f0 2a 20 6f 70 63 6f 64 65 20 69 6e 20 74 68 65 20  * opcode in the 
1a500 62 79 74 65 2d 63 6f 64 65 20 65 6e 67 69 6e 65  byte-code engine
1a510 2e 20 20 42 75 74 20 62 79 20 6d 6f 76 69 6e 67  .  But by moving
1a520 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
1a530 2d 6c 69 6e 65 2c 20 77 65 0a 2a 2a 20 63 61 6e  -line, we.** can
1a540 20 6f 6d 69 74 20 73 6f 6d 65 20 72 65 64 75 6e   omit some redun
1a550 64 61 6e 74 20 74 65 73 74 73 20 61 6e 64 20 6d  dant tests and m
1a560 61 6b 65 20 74 68 61 74 20 6f 70 63 6f 64 65 20  ake that opcode 
1a570 61 20 6c 6f 74 20 66 61 73 74 65 72 2e 20 20 53  a lot faster.  S
1a580 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
1a590 65 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 20 75 73  e is now only us
1a5a0 65 64 20 62 79 20 74 68 65 20 53 54 41 54 33 20  ed by the STAT3 
1a5b0 6c 6f 67 69 63 20 61 6e 64 20 53 54 41 54 33 20  logic and STAT3 
1a5c0 73 75 70 70 6f 72 74 20 68 61 73 0a 2a 2a 20 65  support has.** e
1a5d0 6e 64 65 64 2e 20 20 54 68 65 20 63 6f 64 65 20  nded.  The code 
1a5e0 69 73 20 6b 65 70 74 20 68 65 72 65 20 66 6f 72  is kept here for
1a5f0 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 66 65   historical refe
1a600 72 65 6e 63 65 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75  rence only..*/.u
1a610 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1a620 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
1a630 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
1a640 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b  mat, u32 *pLen){
1a650 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
1a660 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33  Mem->flags;.  u3
1a670 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  2 n;..  assert( 
1a680 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28  pLen!=0 );.  if(
1a690 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
1a6a0 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30  ){.    *pLen = 0
1a6b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1a6c0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
1a6d0 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74  (MEM_Int|MEM_Int
1a6e0 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Real) ){.    /* 
1a6f0 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
1a700 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
1a710 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
1a720 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
1a730 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
1a740 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
1a750 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
1a760 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
1a770 75 36 34 20 75 3b 0a 20 20 20 20 74 65 73 74 63  u64 u;.    testc
1a780 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1a790 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74 65 73 74  _Int );.    test
1a7a0 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
1a7b0 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20  M_IntReal );.   
1a7c0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1a7d0 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
1a7e0 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
1a7f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a800 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
1a810 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
1a820 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
1a830 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
1a840 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
1a850 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
1a860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a870 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
1a880 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a8a0 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
1a8b0 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
1a8c0 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
1a8d0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
1a8e0 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
1a8f0 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
1a900 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
1a910 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
1a920 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
1a930 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
1a940 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
1a950 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
1a960 20 38 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67   8;.    if( flag
1a970 73 26 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 7b  s&MEM_IntReal ){
1a980 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1a990 20 76 61 6c 75 65 20 69 73 20 49 6e 74 52 65 61   value is IntRea
1a9a0 6c 20 61 6e 64 20 69 73 20 67 6f 69 6e 67 20 74  l and is going t
1a9b0 6f 20 74 61 6b 65 20 75 70 20 38 20 62 79 74 65  o take up 8 byte
1a9c0 73 20 74 6f 20 73 74 6f 72 65 0a 20 20 20 20 20  s to store.     
1a9d0 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65 67 65   ** as an intege
1a9e0 72 2c 20 74 68 65 6e 20 77 65 20 6d 69 67 68 74  r, then we might
1a9f0 20 61 73 20 77 65 6c 6c 20 6d 61 6b 65 20 69 74   as well make it
1aa00 20 61 6e 20 38 2d 62 79 74 65 20 66 6c 6f 61 74   an 8-byte float
1aa10 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 6f 69  ing.      ** poi
1aa20 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  nt value */.    
1aa30 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20 28 64    pMem->u.r = (d
1aa40 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e 75 2e 69 3b  ouble)pMem->u.i;
1aa50 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1aa60 67 73 20 26 3d 20 7e 4d 45 4d 5f 49 6e 74 52 65  gs &= ~MEM_IntRe
1aa70 61 6c 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  al;.      pMem->
1aa80 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61  flags |= MEM_Rea
1aa90 6c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  l;.      return 
1aaa0 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  7;.    }.    ret
1aab0 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
1aac0 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
1aad0 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38  ){.    *pLen = 8
1aae0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  ;.    return 7;.
1aaf0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
1ab00 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
1ab10 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
1ab20 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
1ab30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
1ab40 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
1ab50 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
1ab60 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
1ab70 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
1ab80 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
1ab90 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20  ;.  }.  *pLen = 
1aba0 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  n;.  return ((n*
1abb0 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
1abc0 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
1abd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 6e 6c  .}.#endif /* inl
1abe0 69 6e 65 64 20 69 6e 74 6f 20 4f 50 5f 4d 61 6b  ined into OP_Mak
1abf0 65 52 65 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a  eRecord */../*.*
1ac00 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20  * The sizes for 
1ac10 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73  serial types les
1ac20 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74  s than 128.*/.st
1ac30 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71  atic const u8 sq
1ac40 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
1ac50 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  zes[] = {.      
1ac60 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20    /*  0   1   2 
1ac70 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36 20    3   4   5   6 
1ac80 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20    7   8   9 */  
1ac90 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c   ./*   0 */   0,
1aca0 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c    1,  2,  3,  4,
1acb0 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c    6,  8,  8,  0,
1acc0 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20    0,./*  10 */  
1acd0 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
1ace0 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20   1,  1,  2,  2, 
1acf0 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a   3,  3,./*  20 *
1ad00 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20  /   4,  4,  5,  
1ad10 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20  5,  6,  6,  7,  
1ad20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33  7,  8,  8,./*  3
1ad30 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30  0 */   9,  9, 10
1ad40 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32  , 10, 11, 11, 12
1ad50 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a  , 12, 13, 13,./*
1ad60 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c    40 */  14, 14,
1ad70 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c   15, 15, 16, 16,
1ad80 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c   17, 17, 18, 18,
1ad90 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20  ./*  50 */  19, 
1ada0 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20  19, 20, 20, 21, 
1adb0 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20  21, 22, 22, 23, 
1adc0 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32  23,./*  60 */  2
1add0 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32  4, 24, 25, 25, 2
1ade0 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32  6, 26, 27, 27, 2
1adf0 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f  8, 28,./*  70 */
1ae00 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30    29, 29, 30, 30
1ae10 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32  , 31, 31, 32, 32
1ae20 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30  , 33, 33,./*  80
1ae30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c   */  34, 34, 35,
1ae40 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c   35, 36, 36, 37,
1ae50 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20   37, 38, 38,./* 
1ae60 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20   90 */  39, 39, 
1ae70 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20  40, 40, 41, 41, 
1ae80 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a  42, 42, 43, 43,.
1ae90 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34  /* 100 */  44, 4
1aea0 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34  4, 45, 45, 46, 4
1aeb0 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34  6, 47, 47, 48, 4
1aec0 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39  8,./* 110 */  49
1aed0 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31  , 49, 50, 50, 51
1aee0 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33  , 51, 52, 52, 53
1aef0 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20  , 53,./* 120 */ 
1af00 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c   54, 54, 55, 55,
1af10 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a   56, 56, 57, 57.
1af20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  };../*.** Return
1af30 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
1af40 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
1af50 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
1af60 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
1af70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
1af80 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1af90 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
1afa0 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
1afb0 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20  l_type>=128 ){. 
1afc0 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
1afd0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
1afe0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1aff0 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  t( serial_type<1
1b000 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  2 .            |
1b010 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  | sqlite3SmallTy
1b020 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
1b030 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79  ype]==(serial_ty
1b040 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20  pe - 12)/2 );.  
1b050 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1b060 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
1b070 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
1b080 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  .}.u8 sqlite3Vdb
1b090 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79  eOneByteSerialTy
1b0a0 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f  peLen(u8 serial_
1b0b0 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  type){.  assert(
1b0c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38   serial_type<128
1b0d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
1b0e0 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
1b0f0 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
1b100 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77    .}../*.** If w
1b110 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
1b120 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
1b130 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
1b140 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
1b150 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
1b160 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
1b170 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
1b180 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
1b190 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
1b1a0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
1b1b0 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
1b1c0 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
1b1d0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
1b1e0 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
1b1f0 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
1b200 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
1b210 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
1b220 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
1b230 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
1b240 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
1b250 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
1b260 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
1b270 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
1b280 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
1b290 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
1b2a0 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
1b2b0 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
1b2c0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
1b2d0 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
1b2e0 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
1b2f0 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
1b300 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
1b310 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
1b320 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
1b330 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
1b340 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
1b350 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
1b360 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
1b370 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
1b380 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
1b390 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
1b3a0 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
1b3b0 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
1b3c0 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
1b3d0 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
1b3e0 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
1b3f0 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
1b400 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
1b410 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
1b420 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
1b430 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
1b440 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
1b450 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
1b460 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
1b470 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
1b480 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
1b490 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
1b4a0 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
1b4b0 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
1b4c0 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
1b4d0 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
1b4e0 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
1b4f0 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
1b500 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
1b510 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
1b520 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
1b530 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
1b540 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
1b550 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
1b560 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
1b570 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
1b580 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
1b590 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
1b5a0 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
1b5b0 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
1b5c0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1b5d0 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
1b5e0 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
1b5f0 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
1b600 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
1b610 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
1b620 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1b630 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
1b640 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
1b650 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
1b660 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
1b670 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
1b680 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
1b690 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
1b6a0 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
1b6b0 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
1b6c0 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
1b6d0 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
1b6e0 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
1b6f0 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
1b700 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
1b710 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
1b720 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
1b730 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
1b740 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
1b750 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
1b760 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
1b770 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
1b780 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
1b790 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
1b7a0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
1b7b0 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
1b7c0 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
1b7d0 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
1b7e0 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
1b7f0 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
1b800 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
1b810 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
1b820 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
1b830 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
1b840 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
1b850 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
1b860 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1b870 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
1b880 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
1b890 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
1b8a0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
1b8b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
1b8c0 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
1b8d0 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
1b8e0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
1b8f0 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
1b900 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
1b910 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1b920 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
1b930 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
1b940 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
1b950 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1b960 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
1b970 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
1b980 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
1b990 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68  ft in buf[].  Th
1b9a0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1b9b0 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61  onsible.** for a
1b9c0 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68  llocating enough
1b9d0 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20   space to buf[] 
1b9e0 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
1b9f0 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73  re field, exclus
1ba00 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d  ive.** of the pM
1ba10 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65  em->u.nZero byte
1ba20 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f  s for a MEM_Zero
1ba30 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   value..**.** Re
1ba40 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1ba50 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1ba60 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
1ba70 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
1ba80 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
1ba90 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
1baa0 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
1bab0 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
1bac0 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
1bad0 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
1bae0 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
1baf0 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
1bb00 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
1bb10 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d  u8 *buf, Mem *pM
1bb20 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74  em, u32 serial_t
1bb30 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b  ype){.  u32 len;
1bb40 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
1bb50 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
1bb60 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
1bb70 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
1bb80 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
1bb90 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66     u32 i;.    if
1bba0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1bbb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1bbc0 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
1bbd0 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29  eof(pMem->u.r) )
1bbe0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1bbf0 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73  v, &pMem->u.r, s
1bc00 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
1bc10 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1bc20 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
1bc30 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
1bc40 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
1bc50 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
1bc60 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
1bc70 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
1bc80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
1bc90 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  0 );.    do{.   
1bca0 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75     buf[--i] = (u
1bcb0 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
1bcc0 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
1bcd0 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20  while( i );.    
1bce0 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
1bcf0 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
1bd00 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
1bd10 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
1bd20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1bd30 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
1bd40 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1bd50 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30  ?pMem->u.nZero:0
1bd60 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
1bd70 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
1bd80 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1bd90 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
1bda0 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e      len = pMem->
1bdb0 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30  n;.    if( len>0
1bdc0 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70   ) memcpy(buf, p
1bdd0 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
1bde0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
1bdf0 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
1be00 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
1be10 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1be20 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20  }../* Input "x" 
1be30 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  is a sequence of
1be40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63   unsigned charac
1be50 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73  ters that repres
1be60 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64  ent a.** big-end
1be70 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65  ian integer.  Re
1be80 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c  turn the equival
1be90 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67  ent native integ
1bea0 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e  er.*/.#define ON
1beb0 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  E_BYTE_INT(x)   
1bec0 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64   ((i8)(x)[0]).#d
1bed0 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49  efine TWO_BYTE_I
1bee0 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69  NT(x)    (256*(i
1bef0 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31  8)((x)[0])|(x)[1
1bf00 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45  ]).#define THREE
1bf10 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36  _BYTE_INT(x)  (6
1bf20 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  5536*(i8)((x)[0]
1bf30 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78  )|((x)[1]<<8)|(x
1bf40 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[2]).#define FO
1bf50 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20  UR_BYTE_UINT(x) 
1bf60 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c   (((u32)(x)[0]<<
1bf70 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  24)|((x)[1]<<16)
1bf80 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
1bf90 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [3]).#define FOU
1bfa0 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31  R_BYTE_INT(x) (1
1bfb0 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29  6777216*(i8)((x)
1bfc0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  [0])|((x)[1]<<16
1bfd0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
1bfe0 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  )[3])../*.** Des
1bff0 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
1c000 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
1c010 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
1c020 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
1c030 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
1c040 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
1c050 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
1c060 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1c070 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
1c080 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  s function is im
1c090 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f  plemented as two
1c0a0 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
1c0b0 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e  es for performan
1c0c0 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63  ce..** The few c
1c0d0 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72  ases that requir
1c0e0 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
1c0f0 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74  s are broken out
1c100 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65   into a separate
1c110 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  .** routine so t
1c120 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  hat in most case
1c130 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  s the overhead o
1c140 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61  f moving the sta
1c150 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73  ck pointer.** is
1c160 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74   avoided..*/ .st
1c170 61 74 69 63 20 75 33 32 20 73 65 72 69 61 6c 47  atic u32 serialG
1c180 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
1c190 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
1c1a0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
1c1b0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
1c1c0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
1c1d0 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
1c1e0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
1c1f0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
1c200 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
1c210 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
1c220 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
1c230 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
1c240 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
1c250 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1c260 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20  TE_UINT(buf);.  
1c270 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54  u32 y = FOUR_BYT
1c280 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20  E_UINT(buf+4);. 
1c290 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
1c2a0 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
1c2b0 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a  ype==6 ){.    /*
1c2c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c2d0 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75  29851-52272 Valu
1c2e0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1c2f0 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  n 64-bit.    ** 
1c300 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1c310 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1c320 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
1c330 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d  4*)&x;.    pMem-
1c340 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1c350 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c360 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1c370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
1c380 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37  VIDENCE-OF: R-57
1c390 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20  343-49114 Value 
1c3a0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1c3b0 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34  IEEE 754-2008 64
1c3c0 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61  -bit.    ** floa
1c3d0 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ting point numbe
1c3e0 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  r. */.#if !defin
1c3f0 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
1c400 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1c410 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1c420 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  T).    /* Verify
1c430 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
1c440 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
1c450 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
1c460 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74   same.    ** byt
1c470 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
1c480 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
1c490 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
1c4a0 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20  FLOAT is.    ** 
1c4b0 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
1c4c0 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
1c4d0 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
1c4e0 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a   are mixed.    *
1c4f0 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f  * endian..    */
1c500 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1c510 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
1c520 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
1c530 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1c540 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
1c550 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d  .0;.    u64 t2 =
1c560 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78   t1;.    swapMix
1c570 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
1c580 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1c590 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
1c5a0 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
1c5b0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
1c5c0 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
1c5d0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  if.    assert( s
1c5e0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
1c5f0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
1c600 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d  ==8 );.    swapM
1c610 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1c620 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
1c630 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73  pMem->u.r, &x, s
1c640 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70  izeof(x));.    p
1c650 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 49 73 4e  Mem->flags = IsN
1c660 61 4e 28 78 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  aN(x) ? MEM_Null
1c670 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
1c680 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
1c690 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1c6a0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
1c6b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c6c0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
1c6d0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
1c6e0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
1c6f0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
1c700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
1c710 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
1c720 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
1c730 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
1c740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1c750 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
1c760 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
1c770 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
1c780 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1c790 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a 20 49   case 10: { /* I
1c7a0 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79  nternal use only
1c7b0 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69 72 74  : NULL with virt
1c7c0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
1c7d0 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50 44 41           ** UPDA
1c7e0 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66 6c 61  TE no-change fla
1c7f0 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 70  g set */.      p
1c800 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1c810 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a  _Null|MEM_Zero;.
1c820 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
1c830 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  0;.      pMem->u
1c840 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20  .nZero = 0;.    
1c850 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c860 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
1c870 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
1c880 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
1c890 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75  case 0: {  /* Nu
1c8a0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ll */.      /* E
1c8b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
1c8c0 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20  078-09375 Value 
1c8d0 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  is a NULL. */.  
1c8e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1c8f0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
1c900 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c910 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
1c920 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1c930 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36  F: R-44885-25196
1c940 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62   Value is an 8-b
1c950 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
1c960 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  nt.      ** inte
1c970 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1c980 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59  em->u.i = ONE_BY
1c990 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1c9a0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1c9b0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1c9c0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1c9d0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1c9e0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1c9f0 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
1ca00 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
1ca10 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1ca20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1ca30 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c  -49794-35026 Val
1ca40 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1ca50 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20  an 16-bit.      
1ca60 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1ca70 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1ca80 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1ca90 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75   TWO_BYTE_INT(bu
1caa0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1cab0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1cac0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cad0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1cae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
1caf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1cb00 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1cb10 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1cb20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1cb30 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34  E-OF: R-37839-54
1cb40 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62  301 Value is a b
1cb50 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74  ig-endian 24-bit
1cb60 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1cb70 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1cb80 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1cb90 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59  ->u.i = THREE_BY
1cba0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1cbb0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1cbc0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1cbd0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1cbe0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1cbf0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
1cc00 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
1cc10 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
1cc20 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1cc30 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1cc40 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c  -01849-26079 Val
1cc50 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1cc60 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20  an 32-bit.      
1cc70 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1cc80 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1cc90 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1cca0 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62   FOUR_BYTE_INT(b
1ccb0 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50  uf);.#ifdef __HP
1ccc0 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f  _cc .      /* Wo
1ccd0 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e  rk around a sign
1cce0 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69  -extension bug i
1ccf0 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65  n the HP compile
1cd00 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20  r for HP/UX */. 
1cd10 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26       if( buf[0]&
1cd20 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69  0x80 ) pMem->u.i
1cd30 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30   |= 0xffffffff80
1cd40 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66  000000LL;.#endif
1cd50 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1cd60 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1cd70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1cd80 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1cd90 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
1cda0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1cdb0 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
1cdc0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1cdd0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1cde0 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34  F: R-50385-09674
1cdf0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1ce00 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20  endian 48-bit.  
1ce10 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1ce20 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1ce30 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1ce40 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
1ce50 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
1ce60 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1ce70 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1ce80 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1ce90 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1cea0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1ceb0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1cec0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
1ced0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
1cee0 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
1cef0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
1cf00 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
1cf10 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1cf20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  */.      /* Thes
1cf30 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69  e use local vari
1cf40 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65  ables, so do the
1cf50 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  m in a separate 
1cf60 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
1cf70 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
1cf80 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61   to move the fra
1cf90 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  me pointer in th
1cfa0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
1cfb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65  .      return se
1cfc0 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69  rialGet(buf,seri
1cfd0 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20  al_type,pMem);. 
1cfe0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
1cff0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
1d000 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
1d010 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
1d020 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1d030 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36  ENCE-OF: R-12976
1d040 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20  -22893 Value is 
1d050 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a  the integer 0. *
1d060 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1d070 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d  NCE-OF: R-18143-
1d080 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74  12121 Value is t
1d090 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f  he integer 1. */
1d0a0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1d0b0 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
1d0c0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1d0d0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1d0e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1d0f0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1d100 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1d110 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30  DENCE-OF: R-1460
1d120 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73  6-31564 Value is
1d130 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20   a BLOB that is 
1d140 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69  (N-12)/2 bytes i
1d150 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74  n.      ** lengt
1d160 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  h..      ** EVID
1d170 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31  ENCE-OF: R-28401
1d180 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20  -00140 Value is 
1d190 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  a string in the 
1d1a0 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e  text encoding an
1d1b0 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33  d.      ** (N-13
1d1c0 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  )/2 bytes in len
1d1d0 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74  gth. */.      st
1d1e0 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
1d1f0 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
1d200 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d  lob|MEM_Ephem, M
1d210 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Str|MEM_Ephem
1d220 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   };.      pMem->
1d230 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
1d240 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
1d250 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1d260 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
1d270 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73  >flags = aFlag[s
1d280 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20  erial_type&1];. 
1d290 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d       return pMem
1d2a0 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ->n;.    }.  }. 
1d2b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a   return 0;.}./*.
1d2c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d2d0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
1d2e0 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
1d2f0 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
1d300 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
1d310 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
1d320 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
1d330 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
1d340 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
1d350 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
1d360 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1d370 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
1d380 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
1d390 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
1d3a0 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
1d3b0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
1d3c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1d3d0 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
1d3e0 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
1d3f0 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
1d400 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
1d410 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
1d420 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
1d430 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
1d440 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
1d450 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
1d460 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
1d470 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1d480 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
1d490 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
1d4a0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
1d4b0 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
1d4c0 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
1d4d0 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
1d4e0 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
1d4f0 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
1d500 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1d510 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
1d520 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
1d530 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
1d540 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
1d550 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
1d560 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
1d570 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
1d580 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
1d590 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1d5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
1d5b0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1d5c0 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55  record */.){.  U
1d5d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1d5e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d5f0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1d600 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1d610 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1d640 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
1d650 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d   *p */.  nByte =
1d660 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1d670 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1d680 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1d690 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
1d6a0 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e  ld+1);.  p = (Un
1d6b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
1d6c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1d6d0 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
1d6e0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21 70  nByte);.  if( !p
1d6f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1d700 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
1d710 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
1d720 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1d730 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
1d740 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1d750 61 53 6f 72 74 46 6c 61 67 73 21 3d 30 20 29 3b  aSortFlags!=0 );
1d760 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
1d770 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
1d780 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
1d790 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31  o->nKeyField + 1
1d7a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1d7b0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1d7c0 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
1d7d0 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
1d7e0 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c  in pKey[], popul
1d7f0 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61  ate the .** Unpa
1d800 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
1d810 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
1d820 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  y the fourth arg
1d830 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a  ument with the.*
1d840 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1d850 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64  e decoded record
1d860 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
1d870 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1d880 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
1d890 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
1d8a0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
1d8b0 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
1d8c0 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
1d8d0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1d8e0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
1d8f0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
1d900 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1d910 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
1d920 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1d930 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1d940 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70  d *p      /* Pop
1d950 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
1d960 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
1d970 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  rning. */.){.  c
1d980 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1d990 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1d9a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1d9b0 2a 29 70 4b 65 79 3b 0a 20 20 75 33 32 20 64 3b  *)pKey;.  u32 d;
1d9c0 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20   .  u32 idx;    
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1d9f0 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20   aKey[] to read 
1da00 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b  from */.  u16 u;
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1da30 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1da40 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  er */.  u32 szHd
1da50 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  r;.  Mem *pMem =
1da60 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e   p->aMem;..  p->
1da70 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
1da80 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1da90 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1daa0 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  Mem) );.  idx = 
1dab0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1dac0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
1dad0 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a  szHdr;.  u = 0;.
1dae0 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1daf0 64 72 20 26 26 20 64 3c 3d 28 75 33 32 29 6e 4b  dr && d<=(u32)nK
1db00 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1db10 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1db20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1db30 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1db40 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1db50 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1db60 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1db70 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1db80 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1db90 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1dba0 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1dbb0 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1dbc0 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1dbd0 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1dbe0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  alloc = 0;.    p
1dbf0 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20  Mem->z = 0;.    
1dc00 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1dc10 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1dc20 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1dc30 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1dc40 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1dc50 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1dc60 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1dc70 64 3e 28 75 33 32 29 6e 4b 65 79 20 26 26 20 75  d>(u32)nKey && u
1dc80 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1dc90 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1dca0 20 20 2f 2a 20 49 6e 20 61 20 63 6f 72 72 75 70    /* In a corrup
1dcb0 74 20 72 65 63 6f 72 64 20 65 6e 74 72 79 2c 20  t record entry, 
1dcc0 74 68 65 20 6c 61 73 74 20 70 4d 65 6d 20 6d 69  the last pMem mi
1dcd0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ght have been se
1dce0 74 20 75 70 20 75 73 69 6e 67 20 0a 20 20 20 20  t up using .    
1dcf0 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
1dd00 20 6d 65 6d 6f 72 79 2e 20 4f 76 65 72 77 72 69   memory. Overwri
1dd10 74 65 20 69 74 73 20 76 61 6c 75 65 20 77 69 74  te its value wit
1dd20 68 20 4e 55 4c 4c 2c 20 74 6f 20 70 72 65 76 65  h NULL, to preve
1dd30 6e 74 0a 20 20 20 20 2a 2a 20 77 61 72 6e 69 6e  nt.    ** warnin
1dd40 67 73 20 66 72 6f 6d 20 4d 53 41 4e 2e 20 2a 2f  gs from MSAN. */
1dd50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dd60 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d 2d  MemSetNull(pMem-
1dd70 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  1);.  }.  assert
1dd80 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
1dd90 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  KeyField + 1 );.
1dda0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
1ddb0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1ddc0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
1ddd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1dde0 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f  ares two index o
1ddf0 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b  r table record k
1de00 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  eys in the same 
1de10 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71  way.** as the sq
1de20 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1de30 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65  ompare() routine
1de40 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63  . Unlike VdbeRec
1de50 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a  ordCompare(),.**
1de60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1de70 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20  eserializes and 
1de80 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20  compares values 
1de90 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
1dea0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1deb0 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d  t() and sqlite3M
1dec0 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  emCompare() func
1ded0 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65  tions. It is use
1dee0 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  d.** in assert()
1def0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
1df00 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f  nsure that the o
1df10 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e  ptimized code in
1df20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52  .** sqlite3VdbeR
1df30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
1df40 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77  eturns results w
1df50 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72  ith these two pr
1df60 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20  imitives..**.** 
1df70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1df80 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
1df90 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76  parison is equiv
1dfa0 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64  alent to desired
1dfb0 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72  Result..** Retur
1dfc0 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65  n false if there
1dfd0 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65   is a disagreeme
1dfe0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1dff0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1e000 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
1e010 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1e020 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1e030 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
1e040 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1e050 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68  *pPKey2, /* Righ
1e060 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  t key */.  int d
1e070 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20  esiredResult    
1e080 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1e090 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b  ect answer */.){
1e0a0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1e0b0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e0c0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1e0d0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1e0e0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1e0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1e100 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1e110 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
1e120 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
1e130 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
1e140 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e150 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1e160 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
1e170 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
1e180 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1e190 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1e1a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1e1b0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
1e1c0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
1e1d0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
1e1e0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
1e1f0 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65  yInfo;.  if( pKe
1e200 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72  yInfo->db==0 ) r
1e210 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e  eturn 1;.  mem1.
1e220 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1e230 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
1e240 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1e250 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
1e260 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
1e270 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
1e280 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1e290 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
1e2a0 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
1e2b0 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1e2c0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1e2d0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1e2e0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
1e2f0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
1e300 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
1e310 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
1e320 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
1e330 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
1e340 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
1e350 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
1e360 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
1e370 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
1e380 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
1e390 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
1e3a0 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
1e3b0 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
1e3c0 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
1e3d0 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
1e3e0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
1e3f0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
1e400 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
1e410 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
1e420 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1e430 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
1e440 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
1e450 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
1e460 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
1e470 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
1e480 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
1e490 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
1e4a0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
1e4b0 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
1e4c0 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
1e4d0 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
1e4e0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
1e4f0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
1e500 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1e510 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28  , szHdr1);.  if(
1e520 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20   szHdr1>98307 ) 
1e530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e540 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a  RRUPT;.  d1 = sz
1e550 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
1e560 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1e570 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1e580 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
1e590 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1e5a0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c  KeyInfo->aSortFl
1e5b0 61 67 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ags!=0 );.  asse
1e5c0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  rt( pKeyInfo->nK
1e5d0 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  eyField>0 );.  a
1e5e0 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1e5f0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1e600 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1e610 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
1e620 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
1e630 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
1e640 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
1e650 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
1e660 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
1e670 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
1e680 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
1e690 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
1e6a0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1e6b0 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
1e6c0 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
1e6d0 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
1e6e0 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
1e6f0 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
1e700 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
1e710 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
1e720 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
1e730 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1e740 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
1e750 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
1e760 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
1e770 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
1e780 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
1e790 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
1e7a0 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
1e7b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
1e7c0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
1e7d0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1e7e0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
1e7f0 66 28 20 64 31 2b 28 75 36 34 29 73 65 72 69 61  f( d1+(u64)seria
1e800 6c 5f 74 79 70 65 31 2b 32 3e 28 75 36 34 29 6e  l_type1+2>(u64)n
1e810 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
1e820 28 75 36 34 29 73 71 6c 69 74 65 33 56 64 62 65  (u64)sqlite3Vdbe
1e830 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1e840 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 36 34  rial_type1)>(u64
1e850 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
1e860 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e870 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
1e880 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
1e890 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
1e8a0 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
1e8b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1e8c0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1e8d0 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
1e8e0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
1e8f0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
1e900 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1e910 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1e920 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
1e930 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20  >aMem[i],.      
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e       pKeyInfo->n
1e960 41 6c 6c 46 69 65 6c 64 3e 69 20 3f 20 70 4b 65  AllField>i ? pKe
1e970 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
1e980 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
1e990 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1e9a0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1e9b0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1e9c0 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1e9d0 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 4b 65  /.      if( (pKe
1e9e0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61 67  yInfo->aSortFlag
1e9f0 73 5b 69 5d 20 26 20 4b 45 59 49 4e 46 4f 5f 4f  s[i] & KEYINFO_O
1ea00 52 44 45 52 5f 42 49 47 4e 55 4c 4c 29 0a 20 20  RDER_BIGNULL).  
1ea10 20 20 20 20 20 26 26 20 28 28 6d 65 6d 31 2e 66       && ((mem1.f
1ea20 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
1ea30 20 7c 7c 20 28 70 50 4b 65 79 32 2d 3e 61 4d 65   || (pPKey2->aMe
1ea40 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  m[i].flags & MEM
1ea50 5f 4e 75 6c 6c 29 29 20 0a 20 20 20 20 20 20 29  _Null)) .      )
1ea60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1ea70 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1ea80 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1ea90 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 20 26 20  aSortFlags[i] & 
1eaa0 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44 45  KEYINFO_ORDER_DE
1eab0 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  SC ){.        rc
1eac0 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
1ead0 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
1eae0 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
1eaf0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
1eb00 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
1eb10 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
1eb20 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
1eb30 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
1eb40 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1eb50 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
1eb60 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1eb70 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1eb80 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1eb90 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1eba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1ebb0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1ebc0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1ebd0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1ebe0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1ebf0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1ec00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1ec10 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
1ec20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1ec30 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1ec40 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1ec50 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1ec60 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
1ec70 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1ec80 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1ec90 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1eca0 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1ecb0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1ecc0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1ecd0 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
1ece0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1ecf0 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
1ed00 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
1ed10 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
1ed20 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
1ed30 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1ed40 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
1ed50 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1ed60 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1ed70 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
1ed80 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
1ed90 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1eda0 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
1edb0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1edc0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1edd0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1ede0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1edf0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1ee00 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1ee10 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1ee20 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1ee30 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1ee40 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1ee50 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1ee60 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1ee70 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1ee80 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1ee90 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1eea0 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1eeb0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
1eec0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e   constraint is n
1eed0 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74  ot satisfied, it
1eee0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1eef0 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64  high-speed.** vd
1ef00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1ef10 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63  nt() and vdbeRec
1ef20 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1ef30 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  () routines will
1ef40 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  .** not work cor
1ef50 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73  rectly.  If this
1ef60 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66   assert() ever f
1ef70 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c  ires, it probabl
1ef80 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  y means.** that 
1ef90 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79  the KeyInfo.nKey
1efa0 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f  Field or KeyInfo
1efb0 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65  .nAllField value
1efc0 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a  s were computed.
1efd0 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a  ** incorrectly..
1efe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
1eff0 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
1f000 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
1f010 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
1f020 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
1f030 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74   /* The record t
1f040 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63  o verify */ .  c
1f050 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
1f060 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20  eyInfo       /* 
1f070 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74  Compare size wit
1f080 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a  h this KeyInfo *
1f090 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  /.){.  int nFiel
1f0a0 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48  d = 0;.  u32 szH
1f0b0 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20  dr;.  u32 idx;. 
1f0c0 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20   u32 notUsed;.  
1f0d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1f0e0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1f0f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1f100 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43  *)pKey;..  if( C
1f110 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1f120 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56  rn;.  idx = getV
1f130 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1f140 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr);.  assert( 
1f150 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
1f160 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32  ert( szHdr<=(u32
1f170 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65  )nKey );.  while
1f180 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20  ( idx<szHdr ){. 
1f190 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1f1a0 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20  int32(aKey+idx, 
1f1b0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46  notUsed);.    nF
1f1c0 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73  ield++;.  }.  as
1f1d0 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20  sert( nField <= 
1f1e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1f1f0 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1f200 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1f210 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1f220 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1f230 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1f240 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1f250 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1f260 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1f270 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1f280 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1f290 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1f2a0 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1f2b0 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1f2c0 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1f2d0 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1f2e0 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1f2f0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1f300 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1f310 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1f320 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1f330 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1f340 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1f350 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1f360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1f370 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1f380 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1f390 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1f3a0 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1f3b0 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1f3c0 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3e0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1f3f0 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1f400 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1f410 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1f420 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1f430 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1f440 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1f450 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1f460 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1f470 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1f480 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1f490 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1f4a0 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1f4b0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1f4c0 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1f4d0 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1f4e0 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1f4f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1f500 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1f510 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31   *v2;.    Mem c1
1f520 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1f530 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1f540 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1f550 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1f560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1f570 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1f580 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1f590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1f5a0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1f5b0 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1f5c0 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1f5d0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1f5e0 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1f5f0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1f600 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1f610 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1f620 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1f630 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32  ll->enc);.    v2
1f640 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1f650 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1f660 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
1f670 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76  enc);.    if( (v
1f680 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29  1==0 || v2==0) )
1f690 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 63 45  {.      if( prcE
1f6a0 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1f6b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1f6c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  ;.      rc = 0;.
1f6d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f6e0 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d   rc = pColl->xCm
1f6f0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
1f700 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20  c1.n, v1, c2.n, 
1f710 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  v2);.    }.    s
1f720 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1f730 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1f740 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1f750 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
1f760 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
1f770 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
1f780 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e   pBlob is guaran
1f790 74 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f  teed to be a Blo
1f7a0 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61  b that is not ma
1f7b0 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d  rked.** with MEM
1f7c0 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74  _Zero.  Return t
1f7d0 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20  rue if it could 
1f7e0 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a  be a zero-blob..
1f7f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
1f800 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68  AllZero(const ch
1f810 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
1f820 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1f830 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1f840 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74    if( z[i] ) ret
1f850 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1f860 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1f870 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62  Compare two blob
1f880 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
1f890 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1f8a0 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1f8b0 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74  rst.** is less t
1f8c0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1f8d0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1f8e0 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65  he second, respe
1f8f0 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f  ctively..** If o
1f900 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65  ne blob is a pre
1f910 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72  fix of the other
1f920 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74  , then the short
1f930 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72  er is the lessor
1f940 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e  ..*/.SQLITE_NOIN
1f950 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1f960 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1f970 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1f980 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1f990 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d  nt c;.  int n1 =
1f9a0 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e   pB1->n;.  int n
1f9b0 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f  2 = pB2->n;..  /
1f9c0 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
1f9d0 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20   to have a Blob 
1f9e0 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73  value that has s
1f9f0 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e  ome non-zero con
1fa00 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  tent.  ** follow
1fa10 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65  ed by zero conte
1fa20 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e  nt.  But that on
1fa30 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20  ly comes up for 
1fa40 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a  Blobs formed.  *
1fa50 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  * by the OP_Make
1fa60 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61  Record opcode, a
1fa70 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65  nd such Blobs ne
1fa80 76 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69  ver get passed i
1fa90 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1faa0 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f  MemCompare(). */
1fab0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d  .  assert( (pB1-
1fac0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1fad0 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29  o)==0 || n1==0 )
1fae0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32  ;.  assert( (pB2
1faf0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1fb00 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20  ro)==0 || n2==0 
1fb10 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e  );..  if( (pB1->
1fb20 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73  flags|pB2->flags
1fb30 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  ) & MEM_Zero ){.
1fb40 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61      if( pB1->fla
1fb50 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20  gs & pB2->flags 
1fb60 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1fb70 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e      return pB1->
1fb80 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75  u.nZero - pB2->u
1fb90 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73  .nZero;.    }els
1fba0 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73  e if( pB1->flags
1fbb0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1fbc0 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1fbd0 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d  ero(pB2->z, pB2-
1fbe0 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  >n) ) return -1;
1fbf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1fc00 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b  1->u.nZero - n2;
1fc10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fc20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
1fc30 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29  (pB1->z, pB1->n)
1fc40 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1fc50 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20      return n1 - 
1fc60 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1fc70 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65    }.  }.  c = me
1fc80 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32  mcmp(pB1->z, pB2
1fc90 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20  ->z, n1>n2 ? n2 
1fca0 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29  : n1);.  if( c )
1fcb0 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74   return c;.  ret
1fcc0 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a  urn n1 - n2;.}..
1fcd0 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61  /*.** Do a compa
1fce0 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20  rison between a 
1fcf0 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
1fd00 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62  teger and a 64-b
1fd10 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  it floating-poin
1fd20 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65  t.** number.  Re
1fd30 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1fd40 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1fd50 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69   if the first (i
1fd60 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  64) is less than
1fd70 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  ,.** equal to, o
1fd80 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1fd90 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c  he second (doubl
1fda0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1fdb0 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  t sqlite3IntFloa
1fdc0 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20  tCompare(i64 i, 
1fdd0 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28  double r){.  if(
1fde0 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
1fdf0 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20  LE_TYPE)>8 ){.  
1fe00 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
1fe10 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c  E x = (LONGDOUBL
1fe20 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66  E_TYPE)i;.    if
1fe30 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( x<r ) return -
1fe40 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29  1;.    if( x>r )
1fe50 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1fe60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1fe70 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20  e{.    i64 y;.  
1fe80 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20    double s;.    
1fe90 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33  if( r<-922337203
1fea0 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1feb0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66  eturn +1;.    if
1fec0 28 20 72 3e 3d 39 32 32 33 33 37 32 30 33 36 38  ( r>=92233720368
1fed0 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74  54775808.0 ) ret
1fee0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20  urn -1;.    y = 
1fef0 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20  (i64)r;.    if( 
1ff00 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  i<y ) return -1;
1ff10 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 20 72  .    if( i>y ) r
1ff20 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 73 20  eturn +1;.    s 
1ff30 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20  = (double)i;.   
1ff40 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72   if( s<r ) retur
1ff50 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e  n -1;.    if( s>
1ff60 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1ff70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ff80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1ff90 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e  e the values con
1ffa0 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77  tained by the tw
1ffb0 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20  o memory cells, 
1ffc0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67  returning.** neg
1ffd0 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70  ative, zero or p
1ffe0 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31  ositive if pMem1
1fff0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
20000 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
20010 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d  ter.** than pMem
20020 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72  2. Sorting order
20030 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74   is NULL's first
20040 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75  , followed by nu
20050 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a  mbers (integers.
20060 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f  ** and reals) so
20070 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79  rted numerically
20080 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65  , followed by te
20090 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68  xt ordered by th
200a0 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
200b0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e  equence pColl an
200c0 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73  d finally blob's
200d0 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63   ordered by memc
200e0 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  mp()..**.** Two 
200f0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
20100 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c  considered equal
20110 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
20120 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
20130 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73  3MemCompare(cons
20140 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f  t Mem *pMem1, co
20150 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20  nst Mem *pMem2, 
20160 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
20170 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c  Coll){.  int f1,
20180 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
20190 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31  ned_flags;..  f1
201a0 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b   = pMem1->flags;
201b0 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66  .  f2 = pMem2->f
201c0 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64  lags;.  combined
201d0 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a  _flags = f1|f2;.
201e0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
201f0 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65  e3VdbeMemIsRowSe
20200 74 28 70 4d 65 6d 31 29 20 26 26 20 21 73 71 6c  t(pMem1) && !sql
20210 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77  ite3VdbeMemIsRow
20220 53 65 74 28 70 4d 65 6d 32 29 20 29 3b 0a 20 0a  Set(pMem2) );. .
20230 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
20240 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  e is NULL, it is
20250 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f   less than the o
20260 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61  ther. If both va
20270 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55  lues.  ** are NU
20280 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  LL, return 0..  
20290 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
202a0 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  d_flags&MEM_Null
202b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
202c0 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28  f2&MEM_Null) - (
202d0 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  f1&MEM_Null);.  
202e0 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74  }..  /* At least
202f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
20300 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62  values is a numb
20310 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  er.  */.  if( co
20320 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45  mbined_flags&(ME
20330 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d  M_Int|MEM_Real|M
20340 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20  EM_IntReal) ){. 
20350 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6f 6d     testcase( com
20360 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45  bined_flags & ME
20370 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74 65 73  M_Int );.    tes
20380 74 63 61 73 65 28 20 63 6f 6d 62 69 6e 65 64 5f  tcase( combined_
20390 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
203a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
203b0 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
203c0 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29   & MEM_IntReal )
203d0 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  ;.    if( (f1 & 
203e0 66 32 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  f2 & (MEM_Int|ME
203f0 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30 20 29  M_IntReal))!=0 )
20400 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20410 28 20 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f  ( f1 & f2 & MEM_
20420 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Int );.      tes
20430 74 63 61 73 65 28 20 66 31 20 26 20 66 32 20 26  tcase( f1 & f2 &
20440 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a   MEM_IntReal );.
20450 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
20460 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i < pMem2->u.
20470 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  i ) return -1;. 
20480 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
20490 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i > pMem2->u.i
204a0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
204b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
204c0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20    }.    if( (f1 
204d0 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29  & f2 & MEM_Real)
204e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
204f0 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d   pMem1->u.r < pM
20500 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
20510 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
20520 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65  pMem1->u.r > pMe
20530 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e  m2->u.r ) return
20540 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
20550 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
20560 66 28 20 28 66 31 26 28 4d 45 4d 5f 49 6e 74 7c  f( (f1&(MEM_Int|
20570 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30  MEM_IntReal))!=0
20580 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
20590 73 65 28 20 66 31 20 26 20 4d 45 4d 5f 49 6e 74  se( f1 & MEM_Int
205a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
205b0 73 65 28 20 66 31 20 26 20 4d 45 4d 5f 49 6e 74  se( f1 & MEM_Int
205c0 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Real );.      if
205d0 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
205e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
205f0 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46  turn sqlite3IntF
20600 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
20610 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75  1->u.i, pMem2->u
20620 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
20630 20 69 66 28 20 28 66 32 26 28 4d 45 4d 5f 49 6e   if( (f2&(MEM_In
20640 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21  t|MEM_IntReal))!
20650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
20660 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70  ( pMem1->u.i < p
20670 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
20680 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69  rn -1;.        i
20690 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
206a0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
206b0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  urn +1;.        
206c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
206d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
206e0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
206f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
20700 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f1&MEM_Real)!=0
20710 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
20720 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49  2&(MEM_Int|MEM_I
20730 6e 74 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20  ntReal))!=0 ){. 
20740 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20750 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b   f2 & MEM_Int );
20760 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20770 65 28 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 52  e( f2 & MEM_IntR
20780 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 72  eal );.        r
20790 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e  eturn -sqlite3In
207a0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
207b0 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d  em2->u.i, pMem1-
207c0 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
207d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
207e0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
207f0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
20800 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  +1;.  }..  /* If
20810 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
20820 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f  string and the o
20830 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20  ther is a blob, 
20840 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65  the string is le
20850 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
20860 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f   are strings, co
20870 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  mpare using the 
20880 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
20890 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
208a0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
208b0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66  EM_Str ){.    if
208c0 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f1 & MEM_Str)
208d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
208e0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
208f0 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53   if( (f2 & MEM_S
20900 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
20910 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
20920 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ..    assert( pM
20930 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d  em1->enc==pMem2-
20940 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64  >enc || pMem1->d
20950 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20960 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20970 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
20980 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20  E_UTF8 || .     
20990 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e         pMem1->en
209a0 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
209b0 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  E || pMem1->enc=
209c0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
209d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
209e0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
209f0 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
20a00 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
20a10 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20   even if.    ** 
20a20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73  the user deletes
20a30 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
20a40 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68  equence after th
20a50 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69  e vdbe program i
20a60 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  s.    ** compile
20a70 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20  d (this was not 
20a80 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29  always the case)
20a90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
20aa0 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70  ert( !pColl || p
20ab0 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20  Coll->xCmp );.. 
20ac0 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
20ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
20ae0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
20af0 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20  g(pMem1, pMem2, 
20b00 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pColl, 0);.    }
20b10 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c  .    /* If a NUL
20b20 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61  L pointer was pa
20b30 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c  ssed as the coll
20b40 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61  ate function, fa
20b50 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ll through.    *
20b60 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61  * to the blob ca
20b70 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d  se and use memcm
20b80 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20  p().  */.  }. . 
20b90 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
20ba0 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20  must be blobs.  
20bb0 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65  Compare using me
20bc0 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65  mcmp().  */.  re
20bd0 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62  turn sqlite3Blob
20be0 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70  Compare(pMem1, p
20bf0 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Mem2);.}.../*.**
20c00 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
20c10 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
20c20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
20c30 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61   serial-type tha
20c40 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  t.** corresponds
20c50 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   to an integer -
20c60 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77   all values betw
20c70 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c  een 1 and 9 incl
20c80 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74  usive .** except
20c90 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70   7. The second p
20ca0 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
20cb0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
20cc0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a  integer value.**
20cd0 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f   serialized acco
20ce0 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f  rding to serial_
20cf0 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74  type. This funct
20d00 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
20d10 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20  .** and returns 
20d20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  the value..*/.st
20d30 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63  atic i64 vdbeRec
20d40 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32  ordDecodeInt(u32
20d50 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f   serial_type, co
20d60 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
20d70 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74   u32 y;.  assert
20d80 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
20d90 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20  (serial_type>=1 
20da0 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  && serial_type<=
20db0 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  9 && serial_type
20dc0 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68  !=7) );.  switch
20dd0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
20de0 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
20df0 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74   case 1:.      t
20e00 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
20e10 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
20e20 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49  eturn ONE_BYTE_I
20e30 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
20e40 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74  se 2:.      test
20e50 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
20e60 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
20e70 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  rn TWO_BYTE_INT(
20e80 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
20e90 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  3:.      testcas
20ea0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
20eb0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20ec0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
20ed0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34  Key);.    case 4
20ee0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
20ef0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
20f00 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   );.      y = FO
20f10 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
20f20 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  y);.      return
20f30 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
20f40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20f50 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  5: {.      testc
20f60 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
20f70 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
20f80 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  n FOUR_BYTE_UINT
20f90 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
20fa0 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
20fb0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
20fc0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
20fd0 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  {.      u64 x = 
20fe0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
20ff0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
21000 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
21010 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  80 );.      x = 
21020 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
21030 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
21040 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
21050 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i64)*(i64*)&x;. 
21060 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
21070 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  rn (serial_type 
21080 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  - 8);.}../*.** T
21090 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
210a0 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
210b0 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
210c0 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
210d0 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
210e0 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
210f0 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
21100 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
21110 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
21120 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
21130 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
21140 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
21150 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
21160 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
21170 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
21180 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
21190 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
211a0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
211b0 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
211c0 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
211d0 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
211e0 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
211f0 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
21200 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
21210 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
21220 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73  rgument bSkip is
21230 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73   non-zero, it is
21240 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
21250 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
21260 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  eady.** determin
21270 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
21280 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
21290 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a  keys are equal..
212a0 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
212b0 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
212c0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
212d0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
212e0 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a  elds. If all .**
212f0 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70   fields that app
21300 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73  ear in both keys
21310 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
21320 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
21330 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  _rc is .** retur
21340 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  ned..**.** If da
21350 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
21360 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c  n is discovered,
21370 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72   set pPKey2->err
21380 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49  Code to .** SQLI
21390 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72  TE_CORRUPT and r
213a0 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f  eturn 0. If an O
213b0 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
213c0 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b  untered, .** pPK
213d0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20  ey2->errCode is 
213e0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
213f0 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69  MEM and, if it i
21400 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a  s not NULL, the.
21410 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  ** malloc-failed
21420 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74   flag set on dat
21430 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50  abase handle (pP
21440 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
21450 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  db)..*/.int sqli
21460 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21470 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20  pareWithSkip(.  
21480 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
21490 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
214a0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
214b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
214c0 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20  *pPKey2,        
214d0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
214e0 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
21510 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
21520 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
21530 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
21540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21550 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
21560 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
21570 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
21580 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
21590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
215a0 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
215b0 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
215c0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
215f0 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
21600 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
21610 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
21620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
21630 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
21640 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
21650 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21670 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
21680 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
21690 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
216a0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
216b0 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
216c0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
216d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
216e0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
216f0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
21700 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
21710 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
21720 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
21730 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
21740 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
21750 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
21760 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
21770 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
21780 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
21790 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
217a0 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
217b0 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
217c0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
217d0 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
217e0 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
217f0 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
21800 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
21810 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
21820 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
21830 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
21840 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
21850 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
21860 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
21870 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
21880 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
21890 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
218a0 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
218b0 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
218c0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
218d0 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
218e0 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 20 3d   szHdr1;.    i =
218f0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 31   0;.  }.  if( d1
21900 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
21910 20 29 7b 20 0a 20 20 20 20 70 50 4b 65 79 32 2d   ){ .    pPKey2-
21920 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
21930 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21940 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
21950 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
21960 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f   */.  }..  VVA_O
21970 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
21980 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
21990 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
219a0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
219b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
219c0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
219d0 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  AllField>=pPKey2
219e0 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20  ->nField .      
219f0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
21a00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
21a10 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
21a20 6f 72 74 46 6c 61 67 73 21 3d 30 20 29 3b 0a 20  ortFlags!=0 );. 
21a30 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
21a40 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  >pKeyInfo->nKeyF
21a50 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
21a60 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
21a70 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
21a80 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
21a90 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
21aa0 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
21ab0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
21ac0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
21ad0 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74  (MEM_Int|MEM_Int
21ae0 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 74  Real) ){.      t
21af0 65 73 74 63 61 73 65 28 20 70 52 68 73 2d 3e 66  estcase( pRhs->f
21b00 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
21b10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21b20 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
21b30 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20  MEM_IntReal );. 
21b40 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
21b50 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
21b60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21b70 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
21b80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
21b90 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
21ba0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
21bb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21bc0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
21bd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21be0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
21bf0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
21c00 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =7 ){.        sq
21c10 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
21c20 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
21c30 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
21c40 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
21c50 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
21c60 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75  tCompare(pRhs->u
21c70 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20  .i, mem1.u.r);. 
21c80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21c90 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
21ca0 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
21cb0 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
21cc0 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
21cd0 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
21ce0 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
21cf0 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
21d00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
21d10 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
21d20 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
21d30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
21d40 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
21d50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
21d60 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
21d70 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
21d80 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
21d90 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
21da0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
21db0 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
21dc0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
21dd0 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =10 ){.        /
21de0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31  * Serial types 1
21df0 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65  2 or greater are
21e00 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
21e10 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e  bs (greater than
21e20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
21e30 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61  ers). Types 10 a
21e40 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e  nd 11 are curren
21e50 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f  tly "reserved fo
21e60 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20  r future .      
21e70 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74    ** use", so it
21e80 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20   doesn't really 
21e90 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20  matter what the 
21ea0 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
21eb0 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
21ec0 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63  them to numberic
21ed0 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f   values are.  */
21ee0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
21ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21f00 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
21f10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21f20 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
21f30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21f40 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
21f50 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
21f60 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
21f70 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69          if( seri
21f80 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
21f90 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
21fa0 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r<pRhs->u.r )
21fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
21fc0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
21fd0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e   }else if( mem1.
21fe0 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r>pRhs->u.r ){
21ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22000 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = +1;.          
22010 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
22020 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22030 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
22040 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c  ompare(mem1.u.i,
22050 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20   pRhs->u.r);.   
22060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22070 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
22080 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   is a string */.
22090 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
220a0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  s->flags & MEM_S
220b0 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  tr ){.      getV
220c0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
220d0 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
220e0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
220f0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
22100 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
22110 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
22120 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22130 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
22140 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
22150 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
22160 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
22170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22180 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72     mem1.n = (ser
22190 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
221a0 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
221b0 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
221c0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
221d0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
221e0 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
221f0 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  .n+1)==(unsigned
22200 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
22210 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e    if( (d1+mem1.n
22220 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
22230 65 79 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ey1.         || 
22240 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  (pKeyInfo = pPKe
22250 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e 6e  y2->pKeyInfo)->n
22260 41 6c 6c 46 69 65 6c 64 3c 3d 69 0a 20 20 20 20  AllField<=i.    
22270 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
22280 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
22290 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
222a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
222b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
222d0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
222e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
222f0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pKeyInfo->aCol
22300 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
22310 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
22320 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
22330 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
22340 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
22350 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
22360 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
22370 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
22380 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64   (char*)&aKey1[d
22390 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1];.          rc
223a0 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65   = vdbeCompareMe
223b0 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20  mString(.       
223c0 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52         &mem1, pR
223d0 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  hs, pKeyInfo->aC
223e0 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d  oll[i], &pPKey2-
223f0 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20  >errCode.       
22400 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
22410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
22420 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
22430 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
22440 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
22450 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
22460 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
22470 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22480 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
22490 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
224a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
224b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
224c0 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
224d0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
224e0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
224f0 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73  Blob ){.      as
22500 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61  sert( (pRhs->fla
22510 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
22520 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20  0 || pRhs->n==0 
22530 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  );.      getVari
22540 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
22550 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
22560 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22570 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
22580 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
22590 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20  rial_type<12 || 
225a0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
225b0 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
225c0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
225d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
225e0 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c  t nStr = (serial
225f0 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
22600 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22610 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75  e( (d1+nStr)==(u
22620 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
22630 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22640 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d  e( (d1+nStr+1)==
22650 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
22660 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
22670 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
22680 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
22690 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
226a0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
226b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
226c0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
226d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
226e0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
226f0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
22700 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
22710 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
22720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
22730 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e   !isAllZero((con
22740 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  st char*)&aKey1[
22750 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20  d1],nStr) ){.   
22760 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
22770 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
22780 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
22790 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
227a0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20  u.nZero;.       
227b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
227c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
227d0 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
227e0 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
227f0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
22800 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
22810 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
22820 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
22830 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
22840 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
22850 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22860 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
22870 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
22880 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
22890 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
228a0 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
228b0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
228c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
228d0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
228e0 6e 74 20 73 6f 72 74 46 6c 61 67 73 20 3d 20 70  nt sortFlags = p
228f0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
22900 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 3b 0a  >aSortFlags[i];.
22910 20 20 20 20 20 20 69 66 28 20 73 6f 72 74 46 6c        if( sortFl
22920 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ags ){.        i
22930 66 28 20 28 73 6f 72 74 46 6c 61 67 73 20 26 20  f( (sortFlags & 
22940 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 42 49  KEYINFO_ORDER_BI
22950 47 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20  GNULL)==0.      
22960 20 20 20 7c 7c 20 28 28 73 6f 72 74 46 6c 61 67     || ((sortFlag
22970 73 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45  s & KEYINFO_ORDE
22980 52 5f 44 45 53 43 29 0a 20 20 20 20 20 20 20 20  R_DESC).        
22990 20 20 20 21 3d 28 73 65 72 69 61 6c 5f 74 79 70     !=(serial_typ
229a0 65 3d 3d 30 20 7c 7c 20 28 70 52 68 73 2d 3e 66  e==0 || (pRhs->f
229b0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 29 29  lags&MEM_Null)))
229c0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
229d0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
229e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
229f0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
22a00 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
22a10 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
22a20 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
22a30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22a40 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
22a50 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
22a60 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
22a70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22a80 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
22a90 20 20 20 20 69 66 28 20 69 3d 3d 70 50 4b 65 79      if( i==pPKey
22aa0 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  2->nField ) brea
22ab0 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  k;.    pRhs++;. 
22ac0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
22ad0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
22ae0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
22af0 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
22b00 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
22b10 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
22b20 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
22b30 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 64 31  ned)szHdr1 && d1
22b40 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  <=(unsigned)nKey
22b50 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  1 );..  /* No me
22b60 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
22b70 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
22b80 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
22b90 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
22ba0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
22bb0 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
22bc0 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
22bd0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
22be0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
22bf0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
22c00 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
22c10 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a  lease(&mem1).  *
22c20 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
22c30 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
22c40 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
22c50 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
22c60 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
22c70 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
22c80 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
22c90 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
22ca0 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
22cb0 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
22cc0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
22cd0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
22ce0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
22cf0 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
22d00 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
22d10 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
22d20 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50  Key1, pPKey2, pP
22d30 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
22d40 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  ) .       || pPK
22d50 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
22d60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
22d70 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65    );.  pPKey2->e
22d80 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74  qSeen = 1;.  ret
22d90 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
22da0 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  ult_rc;.}.int sq
22db0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22dc0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
22dd0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
22de0 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
22df0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
22e00 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
22e10 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2          /* Ri
22e20 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
22e30 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
22e40 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
22e50 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
22e60 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
22e70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
22e80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
22e90 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
22ea0 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
22eb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
22ec0 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
22ed0 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
22ee0 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
22ef0 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
22f00 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
22f10 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
22f20 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
22f30 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
22f40 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
22f50 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
22f60 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
22f70 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
22f80 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
22f90 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
22fa0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
22fb0 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
22fc0 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
22fd0 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
22fe0 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
22ff0 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
23000 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
23010 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
23020 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
23030 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
23040 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
23050 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
23060 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
23070 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
23080 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
23090 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
230a0 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
230b0 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
230c0 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
230d0 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
230e0 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
230f0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
23100 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
23110 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b  64 v;.  i64 lhs;
23120 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
23130 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
23140 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
23150 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
23160 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
23170 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
23180 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
23190 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
231a0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
231b0 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
231c0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
231d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
231e0 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
231f0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
23200 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
23210 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23220 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
23230 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
23240 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
23250 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
23260 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
23270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
23280 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
23290 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
232a0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
232b0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
232c0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
232d0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
232e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
232f0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
23300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23310 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
23320 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
23330 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
23340 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
23350 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
23360 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
23370 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
23380 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
23390 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
233a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
233b0 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
233c0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
233d0 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
233e0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
233f0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
23400 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
23410 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
23420 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
23430 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23440 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
23450 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
23460 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
23470 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
23480 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
23490 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
234a0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
234b0 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
234c0 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
234d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
234e0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
234f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
23500 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
23510 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
23520 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
23530 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
23540 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
23550 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
23560 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
23570 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
23580 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
23590 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
235a0 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
235b0 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
235c0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
235d0 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
235e0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
235f0 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
23600 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
23610 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
23620 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
23630 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
23640 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
23650 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
23660 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
23670 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
23680 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
23690 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
236a0 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
236b0 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
236c0 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
236d0 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
236e0 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
236f0 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
23700 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
23710 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
23720 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
23730 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
23740 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
23750 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
23760 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
23770 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
23780 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79    }..  v = pPKey
23790 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
237a0 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20    if( v>lhs ){. 
237b0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
237c0 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r1;.  }else if(
237d0 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v<lhs ){.    re
237e0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
237f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65    }else if( pPKe
23800 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
23810 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
23820 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
23830 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
23840 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  l. Compare the t
23850 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20  railing .    ** 
23860 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20  fields.  */.    
23870 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
23880 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
23890 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
238a0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
238b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
238c0 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
238d0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
238e0 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20  s are equal and 
238f0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61  there are no tra
23900 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65  iling.    ** fie
23910 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65  lds. Return pPKe
23920 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
23930 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
23940 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
23950 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
23960 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
23970 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 1;.  }..  ass
23980 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
23990 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
239a0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
239b0 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75  , res) );.  retu
239c0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
239d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
239e0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
239f0 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
23a00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
23a10 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
23a20 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
23a30 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
23a40 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62   string, that (b
23a50 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
23a60 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f  d.** uses the co
23a70 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
23a80 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20   BINARY and (c) 
23a90 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
23aa0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a  -header varint .
23ab0 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ** at the start 
23ac0 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
23ad0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
23ae0 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  e byte..*/.stati
23af0 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
23b00 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20  CompareString(. 
23b10 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
23b20 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
23b30 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
23b40 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
23b50 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
23b60 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
23b70 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
23b80 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  y1 = (const u8*)
23b90 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72  pKey1;.  int ser
23ba0 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20  ial_type;.  int 
23bb0 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
23bc0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
23bd0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
23be0 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  );.  vdbeAssertF
23bf0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
23c00 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
23c10 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
23c20 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69  Info);.  getVari
23c30 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
23c40 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
23c50 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
23c60 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  12 ){.    res = 
23c70 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20  pPKey2->r1;     
23c80 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
23c90 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72  ) is a number or
23ca0 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c   a null */.  }el
23cb0 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
23cc0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20  type & 0x01) ){ 
23cd0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
23ce0 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28  2->r2;      /* (
23cf0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
23d00 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73  a blob */.  }els
23d10 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  e{.    int nCmp;
23d20 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20  .    int nStr;. 
23d30 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61     int szHdr = a
23d40 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53  Key1[0];..    nS
23d50 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
23d60 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69  e-12) / 2;.    i
23d70 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72  f( (szHdr + nStr
23d80 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ) > nKey1 ){.   
23d90 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
23da0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
23db0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23dc0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
23dd0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
23de0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
23df0 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
23e00 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
23e10 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
23e20 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
23e30 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
23e40 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
23e50 20 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20    if( res>0 ){. 
23e60 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
23e70 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
23e80 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
23e90 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
23ea0 2d 3e 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->r1;.    }else{
23eb0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
23ec0 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
23ed0 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
23ee0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
23ef0 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
23f00 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
23f10 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
23f20 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23f30 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
23f40 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
23f50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
23f60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
23f70 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
23f80 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
23f90 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
23fa0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
23fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
23fc0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
23fd0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
23fe0 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
23ff0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
24000 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
24010 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
24020 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
24030 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
24040 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
24050 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20  ey2, res).      
24060 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
24070 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
24080 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
24090 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
240a0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
240b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
240c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
240d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
240e0 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74  Compare() compat
240f0 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ible function.**
24100 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f   suitable for co
24110 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a  mparing serializ
24120 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ed records to th
24130 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
24140 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  d passed.** as t
24150 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
24160 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61  ..*/.RecordCompa
24170 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  re sqlite3VdbeFi
24180 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b  ndCompare(Unpack
24190 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
241a0 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  /* varintRecordC
241b0 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
241c0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
241d0 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68  areString() both
241e0 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61   assume.  ** tha
241f0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
24200 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74  ader varint that
24210 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
24220 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63  tart of each rec
24230 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e  ord.  ** fits in
24240 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28   a single byte (
24250 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c  i.e. is 127 or l
24260 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f  ess). varintReco
24270 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20  rdCompareInt(). 
24280 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   ** also assumes
24290 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
242a0 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62   to overread a b
242b0 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73  uffer by at leas
242c0 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69  t the .  ** maxi
242d0 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67  mum possible leg
242e0 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70  al header size p
242f0 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63  lus 8 bytes. Bec
24300 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20  ause there is.  
24310 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
24320 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20   be at least 74 
24330 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79  (but not 136) by
24340 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66  tes of padding f
24350 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20  ollowing each.  
24360 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
24370 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64   to varintRecord
24380 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69  CompareInt() thi
24390 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65  s makes it conve
243a0 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69  nient to.  ** li
243b0 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  mit the size of 
243c0 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34  the header to 64
243d0 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20   bytes in cases 
243e0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
243f0 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e  field.  ** is an
24400 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20   integer..  **. 
24410 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20   ** The easiest 
24420 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  way to enforce t
24430 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20  his limit is to 
24440 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65  consider only re
24450 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20  cords with.  ** 
24460 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73  13 fields or les
24470 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
24480 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65  field is an inte
24490 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ger, the maximum
244a0 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64   legal.  ** head
244b0 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35  er size is (12*5
244c0 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e   + 1 + 1) bytes.
244d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b    */.  if( p->pK
244e0 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
244f0 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  d<=13 ){.    int
24500 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
24510 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
24520 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
24530 61 53 6f 72 74 46 6c 61 67 73 5b 30 5d 20 29 7b  aSortFlags[0] ){
24540 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  .      if( p->pK
24550 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61  eyInfo->aSortFla
24560 67 73 5b 30 5d 20 26 20 4b 45 59 49 4e 46 4f 5f  gs[0] & KEYINFO_
24570 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 20 29 7b  ORDER_BIGNULL ){
24580 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24590 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
245a0 64 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  dCompare;.      
245b0 7d 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  }.      p->r1 = 
245c0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
245d0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
245e0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31        p->r1 = -1
245f0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
24600 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
24610 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e   (flags & MEM_In
24620 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
24630 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
24640 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  pareInt;.    }. 
24650 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
24660 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
24670 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
24680 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
24690 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
246a0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f   flags & MEM_Blo
246b0 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  b );.    if( (fl
246c0 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c  ags & (MEM_Real|
246d0 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d 45 4d 5f  MEM_IntReal|MEM_
246e0 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
246f0 3d 30 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 4b  =0.     && p->pK
24700 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
24710 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
24720 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
24730 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20   MEM_Str );.    
24740 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
24750 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
24760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
24770 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
24780 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
24790 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
247a0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
247b0 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
247c0 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
247d0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
247e0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
247f0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
24800 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
24810 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
24820 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
24830 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
24840 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
24850 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
24860 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
24870 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
24880 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
24890 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
248a0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
248b0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
248c0 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
248d0 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
248e0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
248f0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
24900 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
24910 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
24920 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
24930 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
24940 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
24950 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
24960 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
24970 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
24980 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
24990 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
249a0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
249b0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
249c0 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
249d0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
249e0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
249f0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
24a00 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
24a10 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
24a20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
24a30 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
24a40 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
24a50 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
24a60 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
24a70 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
24a80 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
24a90 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
24aa0 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
24ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
24ac0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
24ad0 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
24ae0 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
24af0 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
24b00 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
24b10 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
24b20 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
24b30 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
24b40 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
24b50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
24b60 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
24b70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  ;.  assert( (nCe
24b80 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
24b90 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
24ba0 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
24bb0 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
24bc0 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
24bd0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
24be0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
24bf0 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
24c00 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
24c10 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
24c20 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
24c30 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
24c40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24c50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
24c60 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
24c70 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
24c80 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
24c90 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
24ca0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
24cb0 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
24cc0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
24cd0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24ce0 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
24cf0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3e  testcase( szHdr>
24d00 30 78 37 66 66 66 66 66 66 66 20 29 3b 0a 20 20  0x7fffffff );.  
24d10 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d 30 20 29  assert( m.n>=0 )
24d20 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
24d30 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73 7a 48 64  (szHdr<3 || szHd
24d40 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d 2e 6e 29  r>(unsigned)m.n)
24d50 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
24d60 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
24d70 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
24d80 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
24d90 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
24da0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
24db0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
24dc0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
24dd0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
24de0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
24df0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
24e00 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
24e10 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
24e20 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
24e30 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
24e40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24e50 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
24e60 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
24e70 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
24e80 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
24e90 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
24ea0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
24eb0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24ec0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
24ed0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
24ee0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
24ef0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
24f00 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
24f10 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
24f20 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
24f30 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
24f40 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
24f50 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
24f60 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
24f70 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  wid = sqlite3Sma
24f80 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65  llTypeSizes[type
24f90 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61  Rowid];.  testca
24fa0 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
24fb0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
24fc0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
24fd0 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
24fe0 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
24ff0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
25000 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
25010 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
25020 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
25030 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
25040 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
25050 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
25060 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
25070 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
25080 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
25090 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
250a0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
250b0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
250c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
250d0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
250e0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
250f0 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
25100 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
25110 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
25120 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
25130 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
25140 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
25150 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
25160 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
25170 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30  e( m.szMalloc!=0
25180 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
25190 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
251a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
251b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
251c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
251d0 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
251e0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
251f0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
25200 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
25210 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
25220 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
25230 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
25240 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
25250 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
25260 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
25270 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
25280 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
25290 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
252a0 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
252b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
252c0 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
252d0 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
252e0 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
252f0 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
25300 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
25310 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
25320 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
25330 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
25340 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
25350 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
25360 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
25370 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
25380 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
25390 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
253a0 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
253b0 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
253c0 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
253d0 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
253e0 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
253f0 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
25400 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
25410 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
25420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
25430 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
25440 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  n */.  VdbeCurso
25450 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
25460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
25470 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
25480 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
25490 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
254a0 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
254b0 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
254c0 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
254d0 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254f0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
25500 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
25510 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
25520 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
25530 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
25540 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20  or *pCur;.  Mem 
25550 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  m;..  assert( pC
25560 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
25570 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
25580 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  Cur = pC->uc.pCu
25590 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rsor;.  assert( 
255a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
255b0 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
255c0 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20  );.  nCellKey = 
255d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
255e0 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20  oadSize(pCur);. 
255f0 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
25600 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
25610 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
25620 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
25630 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61  the way.  ** tha
25640 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
25650 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
25660 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
25670 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
25680 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
25690 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
256a0 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
256b0 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
256c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
256d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
256e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
256f0 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
25700 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
25710 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
25720 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
25730 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69  ellKey, &m);.  i
25740 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
25750 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72  urn rc;.  }.  *r
25760 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
25770 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
25780 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  hSkip(m.n, m.z, 
25790 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20  pUnpacked, 0);. 
257a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
257b0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
257c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
257d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
257e0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
257f0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
25800 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
25810 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
25820 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
25830 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
25840 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
25850 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
25860 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
25870 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
25880 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
25890 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
258a0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
258b0 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
258c0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
258d0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
258e0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
258f0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
25900 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
25910 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
25920 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
25930 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
25940 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
25950 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
25960 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
25970 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
25980 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
25990 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
259a0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
259b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
259c0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
259d0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
259e0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
259f0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
25a00 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
25a10 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
25a20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
25a30 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
25a40 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
25a50 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
25a60 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
25a70 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
25a80 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
25a90 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
25aa0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
25ab0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
25ac0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
25ad0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
25ae0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
25af0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
25b00 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
25b10 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
25b20 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a  s obsolete..**.*
25b30 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c  * If iCode is 1,
25b40 20 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e   then expiration
25b50 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
25b60 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f  he statement sho
25b70 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70  uld.** be reprep
25b80 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
25b90 67 20 72 65 73 74 61 72 74 65 64 2c 20 62 75 74  g restarted, but
25ba0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
25bb0 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20  y running.** it 
25bc0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75  is allowed to ru
25bd0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  n to completion.
25be0 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c  .**.** Internall
25bf0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
25c00 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 56   just sets the V
25c10 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67  dbe.expired flag
25c20 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61   on all.** prepa
25c30 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  red statements. 
25c40 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65 74   The flag is set
25c50 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d   to 1 for an imm
25c60 65 64 69 61 74 65 20 65 78 70 69 72 61 74 69 6f  ediate expiratio
25c70 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20  n.** and set to 
25c80 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72  2 for an advisor
25c90 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f  y expiration..*/
25ca0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
25cb0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
25cc0 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
25cd0 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20  b, int iCode){. 
25ce0 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
25cf0 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
25d00 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
25d10 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
25d20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a  iCode+1;.  }.}..
25d30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25d40 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
25d50 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
25d60 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
25d70 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
25d80 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
25d90 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
25da0 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49   Return the SQLI
25db0 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73  TE_PREPARE flags
25dc0 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a   for a Vdbe..*/.
25dd0 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  u8 sqlite3VdbePr
25de0 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65 20  epareFlags(Vdbe 
25df0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
25e00 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f  >prepFlags;.}../
25e10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
25e20 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
25e30 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
25e40 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
25e50 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
25e60 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
25e70 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
25e80 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
25e90 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
25ea0 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
25eb0 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
25ec0 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
25ed0 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
25ee0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
25ef0 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
25f00 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
25f10 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
25f20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
25f30 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
25f40 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
25f50 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
25f60 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
25f70 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
25f80 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
25f90 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
25fa0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
25fb0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
25fc0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
25fd0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
25fe0 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
25ff0 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61  r[iVar-1];.    a
26000 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66  ssert( (v->db->f
26010 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
26020 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a  ableQPSG)==0 );.
26030 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
26040 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
26050 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
26060 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
26070 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
26080 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
26090 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
260a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
260b0 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
260c0 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
260d0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
260e0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
260f0 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
26100 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  UTF8);.      }. 
26110 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
26120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26130 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
26140 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
26150 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
26160 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
26170 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
26180 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
26190 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
261a0 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
261b0 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
261c0 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
261d0 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
261e0 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
261f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
26200 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
26210 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
26220 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
26230 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
26240 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
26250 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
26260 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20  .  if( iVar>=32 
26270 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
26280 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b  k |= 0x80000000;
26290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
262a0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
262b0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
262c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
262d0 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  ause a function 
262e0 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  to throw an erro
262f0 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c  r if it was call
26300 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e   from OP_PureFun
26310 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  c.** rather than
26320 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OP_Function..**
26330 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20  .** OP_PureFunc 
26340 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
26350 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
26360 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61  deterministic, a
26370 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72  nd should.** thr
26380 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
26390 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74  t is given input
263a0 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  s that would mak
263b0 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  e it non-determi
263c0 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20  nistic..** This 
263d0 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
263e0 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20  ed by date/time 
263f0 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
26400 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  se non-determini
26410 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73  stic.** features
26420 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a   such as 'now'..
26430 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  */.int sqlite3No
26440 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65  tPureFunc(sqlite
26450 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
26460 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
26470 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69  ENABLE_STAT4.  i
26480 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d  f( pCtx->pVdbe==
26490 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  0 ) return 1;.#e
264a0 6e 64 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d  ndif.  if( pCtx-
264b0 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78  >pVdbe->aOp[pCtx
264c0 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  ->iOp].opcode==O
264d0 50 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a 20 20  P_PureFunc ){.  
264e0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
264f0 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
26500 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72 6d       "non-determ
26510 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
26520 20 69 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73   in index expres
26530 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63 6f  sion or CHECK co
26540 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20 20 20 20  nstraint",.     
26550 20 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72    -1);.    retur
26560 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
26570 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 1;.}..#ifndef 
26580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
26590 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
265a0 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
265b0 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
265c0 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
265d0 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
265e0 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
265f0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
26600 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
26610 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
26620 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
26630 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
26640 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
26650 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
26660 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
26670 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
26680 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
26690 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69  tab *pVtab){.  i
266a0 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  f( pVtab->zErrMs
266b0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
266c0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
266d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
266e0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
266f0 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
26700 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
26710 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72  p(db, pVtab->zEr
26720 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
26730 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
26740 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74  ErrMsg);.    pVt
26750 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
26760 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
26770 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
26780 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
26790 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
267a0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
267b0 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K../*.** If the 
267c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
267d0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c  is not NULL, rel
267e0 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74  ease any allocat
267f0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
26800 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d  .** with the mem
26810 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  ory cells in the
26820 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79   p->aMem[] array
26830 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20  . Also free the 
26840 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
26850 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  * structure itse
26860 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65  lf, using sqlite
26870 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  3DbFree()..**.**
26880 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26890 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20 55  s used to free U
268a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
268b0 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74  ructures allocat
268c0 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62  ed by.** the vdb
268d0 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20  eUnpackRecord() 
268e0 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
268f0 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a  n vdbeapi.c..*/.
26900 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
26910 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c  FreeUnpacked(sql
26920 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
26930 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65  ield, UnpackedRe
26940 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
26950 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
26960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
26970 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
26980 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
26990 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20  p->aMem[i];.    
269a0 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c    if( pMem->zMal
269b0 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62  loc ) sqlite3Vdb
269c0 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
269d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
269e0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
269f0 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   p);.  }.}.#endi
26a00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
26a10 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
26a20 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  K */..#ifdef SQL
26a30 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
26a40 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
26a50 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
26a60 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74  pdate hook. If t
26a70 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
26a80 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75   or DELETE pre-u
26a90 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74  pdate call,.** t
26aa0 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65  hen cursor passe
26ab0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
26ac0 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
26ad0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77  point to the row
26ae0 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20   about.** to be 
26af0 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  update or delete
26b00 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  d. If the applic
26b10 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ation calls sqli
26b20 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
26b30 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75  d(),.** the requ
26b40 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ired value will 
26b50 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
26b60 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20   row the cursor 
26b70 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f  points to..*/.vo
26b80 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
26b90 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56  eUpdateHook(.  V
26ba0 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26bc0 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74  * Vdbe pre-updat
26bd0 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65  e hook is invoke
26be0 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75  d by */.  VdbeCu
26bf0 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
26c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26c10 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e  sor to grab old.
26c20 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f  * values from */
26c30 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c50 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53     /* SQLITE_INS
26c60 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
26c70 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  ELETE */.  const
26c80 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
26c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
26ca0 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
26cb0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62   /* Modified tab
26ce0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  le */.  i64 iKey
26cf0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
26d00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
26d10 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  al key value */.
26d20 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
26d50 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a  r new.* record *
26d60 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26d70 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36  db = v->db;.  i6
26d80 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70  4 iKey2;.  PreUp
26d90 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a  date preupdate;.
26da0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
26db0 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl = pTab->zName
26dc0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
26dd0 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65   u8 fakeSortOrde
26de0 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
26df0 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  ( db->pPreUpdate
26e00 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
26e10 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73  &preupdate, 0, s
26e20 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29  izeof(PreUpdate)
26e30 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69  );.  if( HasRowi
26e40 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  d(pTab)==0 ){.  
26e50 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20    iKey1 = iKey2 
26e60 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61  = 0;.    preupda
26e70 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  te.pPk = sqlite3
26e80 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
26e90 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
26ea0 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
26eb0 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
26ec0 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d     iKey2 = v->aM
26ed0 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20  em[iReg].u.i;.  
26ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
26ef0 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key2 = iKey1;.  
26f00 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
26f10 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  t( pCsr->nField=
26f20 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20  =pTab->nCol .   
26f30 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46      || (pCsr->nF
26f40 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
26f50 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  +1 && op==SQLITE
26f60 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d  _DELETE && iReg=
26f70 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65  =-1).  );..  pre
26f80 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20  update.v = v;.  
26f90 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d  preupdate.pCsr =
26fa0 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61   pCsr;.  preupda
26fb0 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72  te.op = op;.  pr
26fc0 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20  eupdate.iNewReg 
26fd0 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64  = iReg;.  preupd
26fe0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d  ate.keyinfo.db =
26ff0 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65   db;.  preupdate
27000 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45  .keyinfo.enc = E
27010 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64  NC(db);.  preupd
27020 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79  ate.keyinfo.nKey
27030 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43  Field = pTab->nC
27040 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  ol;.  preupdate.
27050 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64  keyinfo.aSortOrd
27060 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53  er = (u8*)&fakeS
27070 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75  ortOrder;.  preu
27080 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b  pdate.iKey1 = iK
27090 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey1;.  preupdate
270a0 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a  .iKey2 = iKey2;.
270b0 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61 62    preupdate.pTab
270c0 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e   = pTab;..  db->
270d0 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70 72  pPreUpdate = &pr
270e0 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78  eupdate;.  db->x
270f0 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
27100 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  k(db->pPreUpdate
27110 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62  Arg, db, op, zDb
27120 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69  , zTbl, iKey1, i
27130 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72  Key2);.  db->pPr
27140 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73  eUpdate = 0;.  s
27150 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
27160 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f   preupdate.aReco
27170 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55  rd);.  vdbeFreeU
27180 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75  npacked(db, preu
27190 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b  pdate.keyinfo.nK
271a0 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70  eyField+1, preup
271b0 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b  date.pUnpacked);
271c0 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
271d0 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
271e0 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
271f0 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
27200 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a  .pNewUnpacked);.
27210 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e    if( preupdate.
27220 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  aNew ){.    int 
27230 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
27240 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20  i<pCsr->nField; 
27250 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
27260 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
27270 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65  e(&preupdate.aNe
27280 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w[i]);.    }.   
27290 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
272a0 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61  (db, preupdate.a
272b0 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  New);.  }.}.#end
272c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
272d0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
272e0 4f 4b 20 2a 2f 0a                                OK */.