/ Hex Artifact Content
Login

Artifact aeba258bb045c583bd85ae1e0b218c3542897baf522da1f1ab7da4259a7394ce:


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 20 46 6f 72 77 61 72 64  t.h"../* Forward
0240: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73   references */.s
0250: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45  tatic void freeE
0260: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
0270: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
0280: 6e 63 44 65 66 20 2a 70 44 65 66 29 3b 0a 73 74  ncDef *pDef);.st
0290: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
02a0: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
02b0: 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b  3 *, Op *, int);
02c0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02d0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02e0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
02f0: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0300: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a  beCreate(Parse *
0310: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0320: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0330: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  >db;.  Vdbe *p;.
0340: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
0350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
0360: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0370: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0380: 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 0;.  memset(&
0390: 70 2d 3e 61 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  p->aOp, 0, sizeo
03a0: 66 28 56 64 62 65 29 2d 6f 66 66 73 65 74 6f 66  f(Vdbe)-offsetof
03b0: 28 56 64 62 65 2c 61 4f 70 29 29 3b 0a 20 20 70  (Vdbe,aOp));.  p
03c0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28  ->db = db;.  if(
03d0: 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20   db->pVdbe ){.  
03e0: 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 72    db->pVdbe->pPr
03f0: 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 2d  ev = p;.  }.  p-
0400: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 64  >pNext = db->pVd
0410: 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d  be;.  p->pPrev =
0420: 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 20   0;.  db->pVdbe 
0430: 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  = p;.  p->magic 
0440: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
0450: 54 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 20 3d  T;.  p->pParse =
0460: 20 70 50 61 72 73 65 3b 0a 20 20 70 50 61 72 73   pParse;.  pPars
0470: 65 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  e->pVdbe = p;.  
0480: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
0490: 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61  aLabel==0 );.  a
04a0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
04b0: 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  Label==0 );.  as
04c0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  sert( p->nOpAllo
04d0: 63 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c==0 );.  assert
04e0: 28 20 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c  ( pParse->szOpAl
04f0: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc==0 );.  sqli
0500: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c  te3VdbeAddOp2(p,
0510: 20 4f 50 5f 49 6e 69 74 2c 20 30 2c 20 31 29 3b   OP_Init, 0, 1);
0520: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0530: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0540: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
0550: 61 74 20 6f 77 6e 73 20 61 20 56 64 62 65 20 6f  at owns a Vdbe o
0560: 62 6a 65 63 74 2e 0a 2a 2f 0a 50 61 72 73 65 20  bject..*/.Parse 
0570: 2a 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73  *sqlite3VdbePars
0580: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 72  er(Vdbe *p){.  r
0590: 65 74 75 72 6e 20 70 2d 3e 70 50 61 72 73 65 3b  eturn p->pParse;
05a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
05b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
05c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
05d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
05e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
05f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0600: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0610: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0620: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0630: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0640: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0650: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0660: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0670: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0680: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0690: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
06a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
06b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
06c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
06d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
06e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
06f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0710: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0720: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0730: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0740: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0750: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0760: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0770: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0780: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0790: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
07a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
07b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
07c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
07d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
07e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
07f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0800: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0810: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0820: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0830: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0850: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0860: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0880: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0890: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
08a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
08b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
08c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
08d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0900: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0910: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0920: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0930: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0940: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0950: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0960: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0970: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0980: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0990: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
09a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
09b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
09c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
09d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
09e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
09f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0a00: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0a10: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0a20: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0a30: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0a40: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0a50: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0a60: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0a80: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0a90: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
0aa0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
0ab0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
0ac0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
0ad0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
0ae0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
0af0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0b00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0b10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0b20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0b30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0b40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0b50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0b60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0b70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0b80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0b90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0ba0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0bb0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0bc0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0bd0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0be0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0bf0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0c00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0c10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0c20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0c30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0c40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0c50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0c60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0c70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0c80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0c90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ca0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0cb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0cc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0cd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0ce0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0cf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0d00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0d10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0d20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0d30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0d40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0d50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0d60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0d70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0d80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0d90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0da0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0db0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0dc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0dd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0de0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0df0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0e00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0e10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0e20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0e30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0e40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0e50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0e60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0e70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0e80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0e90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0ea0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0eb0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0ec0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0ed0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0ee0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0ef0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0f00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0f10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0f20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0f30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0f40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0f50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0f60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0f70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0f80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0f90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0fa0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0fb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0fc0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0fd0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0fe0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
1000: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
1010: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
1020: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
1030: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
1040: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
1050: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
1060: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
1070: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
1080: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
1090: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
10a0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
10b0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
10c0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
10d0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
10e0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
10f0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1100: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1110: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1120: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1130: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1140: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1150: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1160: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1170: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1180: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1190: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
11a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
11b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
11c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
11d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
11e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
11f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1200: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1210: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1220: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1230: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1240: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1250: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1260: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1270: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1280: 4e 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c  New = (v->nOpAll
1290: 6f 63 3e 3d 35 31 32 20 3f 20 32 2a 28 73 71 6c  oc>=512 ? 2*(sql
12a0: 69 74 65 33 5f 69 6e 74 36 34 29 76 2d 3e 6e 4f  ite3_int64)v->nO
12b0: 70 41 6c 6c 6f 63 0a 20 20 20 20 20 20 20 20 20  pAlloc.         
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
12d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
12e0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
12f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
1300: 33 5f 69 6e 74 36 34 20 6e 4e 65 77 20 3d 20 28  3_int64 nNew = (
1310: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 32 2a  v->nOpAlloc ? 2*
1320: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76  (sqlite3_int64)v
1330: 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20 20 20 20 20  ->nOpAlloc.     
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e     : (sqlite3_in
1360: 74 36 34 29 28 31 30 32 34 2f 73 69 7a 65 6f 66  t64)(1024/sizeof
1370: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44  (Op)));.  UNUSED
1380: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b  _PARAMETER(nOp);
1390: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
13a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69  sure that the si
13b0: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65  ze of a VDBE doe
13c0: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c  s not grow too l
13d0: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e  arge */.  if( nN
13e0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d  ew > p->db->aLim
13f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1400: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20  VDBE_OP] ){.    
1410: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1420: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  p->db);.    retu
1430: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1440: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1450: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
1460: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
1470: 72 74 28 20 6e 4e 65 77 3e 3d 28 76 2d 3e 6e 4f  rt( nNew>=(v->nO
1480: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
1490: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
14a0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
14b0: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
14c0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
14d0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73  pNew ){.    p->s
14e0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  zOpAlloc = sqlit
14f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1500: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ->db, pNew);.   
1510: 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70   v->nOpAlloc = p
1520: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65  ->szOpAlloc/size
1530: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61  of(Op);.    v->a
1540: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
1550: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
1560: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1570: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1580: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1590: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
15a0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
15b0: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
15c0: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
15d0: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
15e0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
15f0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
1600: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
1610: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
1620: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
1630: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
1650: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
1660: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1670: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1680: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1690: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
16a0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
16b0: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
16c0: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
16d0: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
16e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
16f0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1700: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1710: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1720: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1730: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1740: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
1750: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
1760: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
1770: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1780: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1790: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
17a0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
17b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17c0: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
17d0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
17e0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
17f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1800: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1810: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1820: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1830: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1840: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1850: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
1860: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1870: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
1880: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
1890: 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  ( p->nOpAlloc<=p
18a0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
18b0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
18c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
18d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
18e0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
18f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1900: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1910: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1920: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1930: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
1940: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1950: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
1960: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
1970: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
1980: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
1990: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
19a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
19b0: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f  sert( op>=0 && o
19c0: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
19d0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
19e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
19f0: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1a00: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1a10: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1a20: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1a30: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1a40: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1a50: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1a60: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1a70: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1a80: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1a90: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
1aa0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
1ab0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1ac0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
1ad0: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
1ae0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
1af0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1b00: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1b10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1b20: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1b30: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1b40: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1b50: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1b60: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1b70: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1b80: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1b90: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1ba0: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1bb0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1bc0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1bd0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
1be0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
1bf0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1c00: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1c10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1c20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1c30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1c40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1c50: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1c60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1c70: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1c80: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1c90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ca0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1cb0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1cc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1cd0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1ce0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1cf0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d10: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1d20: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
1d30: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1d40: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1d50: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1d60: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1d70: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1d90: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1db0: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
1dc0: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
1dd0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1de0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
1df0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
1e00: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
1e10: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
1e20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
1e30: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1e40: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1e50: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1e60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1e70: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1e80: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1e90: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1eb0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
1ec0: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
1ed0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
1ee0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
1ef0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
1f00: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
1f10: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
1f20: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
1f30: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1f40: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1f50: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1f60: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1f70: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1f80: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1f90: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1fa0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1fb0: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1fc0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1fd0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
1fe0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
1ff0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
2000: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
2010: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
2020: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
2030: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
2040: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
2050: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
2060: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
2070: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  ng does not end 
2080: 77 69 74 68 20 22 58 22 20 74 68 65 6e 20 61 6e  with "X" then an
2090: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 69 6e   OP_ResultRow in
20a0: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  struction.** is 
20b0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
20c0: 65 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65  e values inserte
20d0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
20e0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
20f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
2100: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
2110: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
2120: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2130: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
2140: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
2150: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
2160: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
2170: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
2180: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
2190: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21a0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
21b0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
21c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21d0: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
21e0: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
21f0: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 69 2c  ng8, 0, iDest+i,
2200: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
2210: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 69 27 20  else if( c=='i' 
2220: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2230: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
2240: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
2250: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
2260: 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +i);.    }else{.
2270: 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2280: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b 0a 20 20  op_resultrow;.  
2290: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
22a0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f  3VdbeAddOp2(p, O
22b0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 44 65  P_ResultRow, iDe
22c0: 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f 6f 70 5f  st, i);.skip_op_
22d0: 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20 76 61 5f  resultrow:.  va_
22e0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
22f0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2300: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2310: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
2320: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2340: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
2350: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2360: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2370: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2380: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2390: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
23a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
23b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23c0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
23d0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
23e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
23f0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2400: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2410: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2420: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2430: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
2440: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
2450: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
2460: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
2470: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
2480: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2490: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
24a0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
24b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
24c0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
24d0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
24e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
24f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
2500: 5f 46 75 6e 63 74 69 6f 6e 20 6f 72 20 4f 50 5f  _Function or OP_
2510: 50 75 72 65 46 75 6e 63 20 6f 70 63 6f 64 65 2e  PureFunc opcode.
2520: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 43 61 6c 6c  .**.** The eCall
2530: 43 74 78 20 61 72 67 75 6d 65 6e 74 20 69 73 20  Ctx argument is 
2540: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 74 79 70  information (typ
2550: 69 63 61 6c 6c 79 20 74 61 6b 65 6e 20 66 72 6f  ically taken fro
2560: 6d 20 45 78 70 72 2e 6f 70 32 29 0a 2a 2a 20 74  m Expr.op2).** t
2570: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
2580: 65 20 63 61 6c 6c 69 6e 67 20 63 6f 6e 74 65 78  e calling contex
2590: 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  t of the functio
25a0: 6e 2e 20 20 30 20 6d 65 61 6e 73 20 61 20 67 65  n.  0 means a ge
25b0: 6e 65 72 61 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f  neral.** functio
25c0: 6e 20 63 61 6c 6c 2e 20 20 4e 43 5f 49 73 43 68  n call.  NC_IsCh
25d0: 65 63 6b 20 6d 65 61 6e 73 20 63 61 6c 6c 65 64  eck means called
25e0: 20 62 79 20 61 20 63 68 65 63 6b 20 63 6f 6e 73   by a check cons
25f0: 74 72 61 69 6e 74 2c 0a 2a 2a 20 4e 43 5f 49 64  traint,.** NC_Id
2600: 78 45 78 70 72 20 6d 65 61 6e 73 20 63 61 6c 6c  xExpr means call
2610: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  ed as part of an
2620: 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
2630: 6e 2e 20 20 4e 43 5f 50 61 72 74 49 64 78 0a 2a  n.  NC_PartIdx.*
2640: 2a 20 6d 65 61 6e 73 20 69 6e 20 74 68 65 20 57  * means in the W
2650: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 61  HERE clause of a
2660: 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20   partial index. 
2670: 20 4e 43 5f 47 65 6e 43 6f 6c 20 6d 65 61 6e 73   NC_GenCol means
2680: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 69 6c 65   called.** while
2690: 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 67 65 6e   computing a gen
26a0: 65 72 61 74 65 64 20 63 6f 6c 75 6d 6e 20 76 61  erated column va
26b0: 6c 75 65 2e 20 20 30 20 69 73 20 74 68 65 20 75  lue.  0 is the u
26c0: 73 75 61 6c 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  sual case..*/.in
26d0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
26e0: 46 75 6e 63 74 69 6f 6e 43 61 6c 6c 28 0a 20 20  FunctionCall(.  
26f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2700: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2710: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
2720: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
2730: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 20      /* Constant 
2740: 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 2a 2f  argument mask */
2750: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
2760: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2770: 74 20 61 72 67 75 6d 65 6e 74 20 72 65 67 69 73  t argument regis
2780: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  ter */.  int p3,
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27a0: 2a 20 52 65 67 69 73 74 65 72 20 69 6e 74 6f 20  * Register into 
27b0: 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72  which results ar
27c0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  e written */.  i
27d0: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
27e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27f0: 66 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20  f argument */.  
2800: 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 2a 70  const FuncDef *p
2810: 46 75 6e 63 2c 20 2f 2a 20 54 68 65 20 66 75 6e  Func, /* The fun
2820: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
2830: 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 43 61  ked */.  int eCa
2840: 6c 6c 43 74 78 20 20 20 20 20 20 20 20 20 20 2f  llCtx          /
2850: 2a 20 43 61 6c 6c 69 6e 67 20 63 6f 6e 74 65 78  * Calling contex
2860: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
2870: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2880: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
2890: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 73 71    int addr;.  sq
28a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
28b0: 43 74 78 3b 0a 20 20 61 73 73 65 72 74 28 20 76  Ctx;.  assert( v
28c0: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   );.  nByte = si
28d0: 7a 65 6f 66 28 2a 70 43 74 78 29 20 2b 20 28 6e  zeof(*pCtx) + (n
28e0: 41 72 67 2d 31 29 2a 73 69 7a 65 6f 66 28 73 71  Arg-1)*sizeof(sq
28f0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0a 20  lite3_value*);. 
2900: 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44   pCtx = sqlite3D
2910: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61  bMallocRawNN(pPa
2920: 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  rse->db, nByte);
2930: 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29  .  if( pCtx==0 )
2940: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2950: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2960: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 66 72  Failed );.    fr
2970: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
2980: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
2990: 28 46 75 6e 63 44 65 66 2a 29 70 46 75 6e 63 29  (FuncDef*)pFunc)
29a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
29b0: 20 20 7d 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74    }.  pCtx->pOut
29c0: 20 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 70 46   = 0;.  pCtx->pF
29d0: 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  unc = (FuncDef*)
29e0: 70 46 75 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 70  pFunc;.  pCtx->p
29f0: 56 64 62 65 20 3d 20 76 3b 0a 20 20 70 43 74 78  Vdbe = v;.  pCtx
2a00: 2d 3e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20  ->isError = 0;. 
2a10: 20 70 43 74 78 2d 3e 61 72 67 63 20 3d 20 6e 41   pCtx->argc = nA
2a20: 72 67 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  rg;.  addr = sql
2a30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2a40: 2c 20 65 43 61 6c 6c 43 74 78 20 3f 20 4f 50 5f  , eCallCtx ? OP_
2a50: 50 75 72 65 46 75 6e 63 20 3a 20 4f 50 5f 46 75  PureFunc : OP_Fu
2a60: 6e 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  nction,.        
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 28     p1, p2, p3, (
2a90: 63 68 61 72 2a 29 70 43 74 78 2c 20 50 34 5f 46  char*)pCtx, P4_F
2aa0: 55 4e 43 43 54 58 29 3b 0a 20 20 70 43 74 78 2d  UNCCTX);.  pCtx-
2ab0: 3e 69 4f 70 20 3d 20 61 64 64 72 3b 0a 20 20 72  >iOp = addr;.  r
2ac0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2ad0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
2ae0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
2af0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 77 69   the p4 value wi
2b00: 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20 6f 72  th a P4_INT64 or
2b10: 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79 70 65  .** P4_REAL type
2b20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b30: 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 0a  VdbeAddOp4Dup8(.
2b40: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
2b50: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
2b60: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
2b70: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b90: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
2ba0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
2bb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
2bc0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2bd0: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
2be0: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
2bf0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c10: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
2c20: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50  /.  const u8 *zP
2c30: 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50  4,      /* The P
2c40: 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  4 operand */.  i
2c50: 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20  nt p4type       
2c60: 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64     /* P4 operand
2c70: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 63 68   type */.){.  ch
2c80: 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73 71 6c  ar *p4copy = sql
2c90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
2ca0: 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  N(sqlite3VdbeDb(
2cb0: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
2cc0: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
2cd0: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
2ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
2cf0: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
2d00: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
2d10: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
2d20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d30: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
2d40: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
2d50: 64 72 65 73 73 20 6f 66 20 74 68 65 20 63 75 72  dress of the cur
2d60: 72 65 6e 74 20 45 58 50 4c 41 49 4e 20 51 55 45  rent EXPLAIN QUE
2d70: 52 59 20 50 4c 41 4e 20 62 61 73 65 6c 69 6e 65  RY PLAN baseline
2d80: 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 22 6e 6f  ..** 0 means "no
2d90: 6e 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ne"..*/.int sqli
2da0: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 61  te3VdbeExplainPa
2db0: 72 65 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  rent(Parse *pPar
2dc0: 73 65 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70  se){.  VdbeOp *p
2dd0: 4f 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  Op;.  if( pParse
2de0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 3d 3d 30  ->addrExplain==0
2df0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
2e00: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
2e10: 47 65 74 4f 70 28 70 50 61 72 73 65 2d 3e 70 56  GetOp(pParse->pV
2e20: 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  dbe, pParse->add
2e30: 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 72 65 74  rExplain);.  ret
2e40: 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 7d 0a 0a  urn pOp->p2;.}..
2e50: 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 64 65 62 75  /*.** Set a debu
2e60: 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 20  gger breakpoint 
2e70: 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
2e80: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
2e90: 72 20 74 6f 0a 2a 2a 20 6d 6f 6e 69 74 6f 72 20  r to.** monitor 
2ea0: 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
2eb0: 59 20 50 4c 41 4e 20 63 6f 64 65 20 67 65 6e 65  Y PLAN code gene
2ec0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 20 64  ration..*/.#if d
2ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
2ee0: 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  BUG).void sqlite
2ef0: 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f 69  3ExplainBreakpoi
2f00: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  nt(const char *z
2f10: 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  1, const char *z
2f20: 32 29 7b 0a 20 20 28 76 6f 69 64 29 7a 31 3b 0a  2){.  (void)z1;.
2f30: 20 20 28 76 6f 69 64 29 7a 32 3b 0a 7d 0a 23 65    (void)z2;.}.#e
2f40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ndif../*.** Add 
2f50: 61 20 6e 65 77 20 4f 50 5f 20 6f 70 63 6f 64 65  a new OP_ opcode
2f60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
2f70: 50 75 73 68 20 66 6c 61 67 20 69 73 20 74 72 75  Push flag is tru
2f80: 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 69  e, then make thi
2f90: 73 20 6f 70 63 6f 64 65 20 74 68 65 20 70 61 72  s opcode the par
2fa0: 65 6e 74 20 66 6f 72 0a 2a 2a 20 73 75 62 73 65  ent for.** subse
2fb0: 71 75 65 6e 74 20 45 78 70 6c 61 69 6e 73 20 75  quent Explains u
2fc0: 6e 74 69 6c 20 73 71 6c 69 74 65 33 56 64 62 65  ntil sqlite3Vdbe
2fd0: 45 78 70 6c 61 69 6e 50 6f 70 28 29 20 69 73 20  ExplainPop() is 
2fe0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  called..*/.void 
2ff0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
3000: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
3010: 2c 20 75 38 20 62 50 75 73 68 2c 20 63 6f 6e 73  , u8 bPush, cons
3020: 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  t char *zFmt, ..
3030: 2e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
3040: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 41 6c  TE_DEBUG.  /* Al
3050: 77 61 79 73 20 69 6e 63 6c 75 64 65 20 74 68 65  ways include the
3060: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
3070: 64 65 73 20 69 66 20 53 51 4c 49 54 45 5f 44 45  des if SQLITE_DE
3080: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
3090: 20 20 2a 2a 20 42 75 74 20 6f 6d 69 74 20 74 68    ** But omit th
30a0: 65 6d 20 28 66 6f 72 20 70 65 72 66 6f 72 6d 61  em (for performa
30b0: 6e 63 65 29 20 64 75 72 69 6e 67 20 70 72 6f 64  nce) during prod
30c0: 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 20 2a 2f  uction builds */
30d0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
30e0: 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64  xplain==2 ).#end
30f0: 69 66 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20  if.  {.    char 
3100: 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62 65 20  *zMsg;.    Vdbe 
3110: 2a 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20  *v;.    va_list 
3120: 61 70 3b 0a 20 20 20 20 69 6e 74 20 69 54 68 69  ap;.    int iThi
3130: 73 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  s;.    va_start(
3140: 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a  ap, zFmt);.    z
3150: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Msg = sqlite3VMP
3160: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
3170: 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20  , zFmt, ap);.   
3180: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20   va_end(ap);.   
3190: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
31a0: 62 65 3b 0a 20 20 20 20 69 54 68 69 73 20 3d 20  be;.    iThis = 
31b0: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69  v->nOp;.    sqli
31c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
31d0: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 54 68   OP_Explain, iTh
31e0: 69 73 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  is, pParse->addr
31f0: 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20 20 20  Explain, 0,.    
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d    zMsg, P4_DYNAM
3220: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
3230: 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f 69 6e  ExplainBreakpoin
3240: 74 28 62 50 75 73 68 3f 22 50 55 53 48 22 3a 22  t(bPush?"PUSH":"
3250: 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  ", sqlite3VdbeGe
3260: 74 4f 70 28 76 2c 2d 31 29 2d 3e 70 34 2e 7a 29  tOp(v,-1)->p4.z)
3270: 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73 68 29  ;.    if( bPush)
3280: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
3290: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69 54  addrExplain = iT
32a0: 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  his;.    }.  }.}
32b0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20  ../*.** Pop the 
32c0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
32d0: 41 4e 20 73 74 61 63 6b 20 6f 6e 65 20 6c 65 76  AN stack one lev
32e0: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
32f0: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f  te3VdbeExplainPo
3300: 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  p(Parse *pParse)
3310: 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  {.  sqlite3Expla
3320: 69 6e 42 72 65 61 6b 70 6f 69 6e 74 28 22 50 4f  inBreakpoint("PO
3330: 50 22 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65  P", 0);.  pParse
3340: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
3350: 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
3360: 69 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65 29  inParent(pParse)
3370: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3380: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
3390: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  N */../*.** Add 
33a0: 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  an OP_ParseSchem
33b0: 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  a opcode.  This 
33c0: 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65  routine is broke
33d0: 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71  n out from.** sq
33e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
33f0: 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73  ) since it needs
3400: 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74   to also needs t
3410: 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65  o mark all btree
3420: 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62  s.** as having b
3430: 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  een used..**.** 
3440: 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e  The zWhere strin
3450: 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
3460: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3470: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
3480: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3490: 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72   will take owner
34a0: 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ship of the allo
34b0: 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  cated memory..*/
34c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
34d0: 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
34e0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  p(Vdbe *p, int i
34f0: 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65  Db, char *zWhere
3500: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71  ){.  int j;.  sq
3510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
3520: 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  p, OP_ParseSchem
3530: 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57  a, iDb, 0, 0, zW
3540: 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  here, P4_DYNAMIC
3550: 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
3560: 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29  p->db->nDb; j++)
3570: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3580: 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a  Btree(p, j);.}..
3590: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
35a0: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
35b0: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
35c0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  s an integer..*/
35d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
35e0: 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62  AddOp4Int(.  Vdb
35f0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
3600: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
3610: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
3620: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3630: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
3640: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
3650: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
3660: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
3670: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3690: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
36a0: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
36b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
36c0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  3 operand */.  i
36d0: 6e 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20  nt p4           
36e0: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
36f0: 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67  rand as an integ
3700: 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  er */.){.  int a
3710: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3720: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
3730: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 69 66  1, p2, p3);.  if
3740: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
3750: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
3760: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70  VdbeOp *pOp = &p
3770: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20  ->aOp[addr];.   
3780: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3790: 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f 70  4_INT32;.    pOp
37a0: 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20 7d  ->p4.i = p4;.  }
37b0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
37c0: 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  }../* Insert the
37d0: 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75   end of a co-rou
37e0: 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tine.*/.void sql
37f0: 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
3800: 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  tine(Vdbe *v, in
3810: 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20 20 73  t regYield){.  s
3820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3830: 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
3840: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
3850: 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
3860: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
3870: 65 72 20 63 61 63 68 65 2c 20 74 68 65 72 65 62  er cache, thereb
3880: 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  y ensuring that 
3890: 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75  each.  ** co-rou
38a0: 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f 77 6e  tine has its own
38b0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 74   independent set
38c0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c 20 62   of registers, b
38d0: 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e  ecause co-routin
38e0: 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65 78  es.  ** might ex
38f0: 70 65 63 74 20 74 68 65 69 72 20 72 65 67 69 73  pect their regis
3900: 74 65 72 73 20 74 6f 20 62 65 20 70 72 65 73 65  ters to be prese
3910: 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e 20 4f  rved across an O
3920: 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a  P_Yield, and.  *
3930: 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63 61 75  * that could cau
3940: 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66 20 74  se problems if t
3950: 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f  wo or more co-ro
3960: 75 74 69 6e 65 73 20 61 72 65 20 75 73 69 6e 67  utines are using
3970: 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74   the same.  ** t
3980: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
3990: 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61  r..  */.  v->pPa
39a0: 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
39b0: 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e  0;.  v->pParse->
39c0: 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
39d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
39e0: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
39f0: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
3a00: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
3a10: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
3a20: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
3a30: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
3a40: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
3a50: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
3a60: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
3a70: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
3a80: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
3a90: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
3aa0: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
3ab0: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
3ac0: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
3ad0: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
3ae0: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
3af0: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
3b00: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
3b10: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
3b20: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
3b30: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
3b40: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
3b50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
3b60: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
3b70: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
3b80: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
3b90: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
3ba0: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
3bb0: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
3bc0: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
3bd0: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
3be0: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
3bf0: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
3c00: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
3c10: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 20  be resolved..** 
3c20: 28 4c 61 74 65 72 3a 29 20 54 68 69 73 20 69 73  (Later:) This is
3c30: 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72 20 6f   only true for o
3c40: 70 63 6f 64 65 73 20 74 68 61 74 20 68 61 76 65  pcodes that have
3c50: 20 74 68 65 20 4f 50 46 4c 47 5f 4a 55 4d 50 0a   the OPFLG_JUMP.
3c60: 2a 2a 20 70 72 6f 70 65 72 74 79 2e 0a 2a 2a 0a  ** property..**.
3c70: 2a 2a 20 56 61 72 69 61 62 6c 65 20 75 73 61 67  ** Variable usag
3c80: 65 20 6e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e notes:.**.**  
3c90: 20 20 20 50 61 72 73 65 2e 61 4c 61 62 65 6c 5b     Parse.aLabel[
3ca0: 78 5d 20 20 20 20 20 53 74 6f 72 65 73 20 74 68  x]     Stores th
3cb0: 65 20 61 64 64 72 65 73 73 20 74 68 61 74 20 74  e address that t
3cc0: 68 65 20 78 2d 74 68 20 6c 61 62 65 6c 20 72 65  he x-th label re
3cd0: 73 6f 6c 76 65 73 0a 2a 2a 20 20 20 20 20 20 20  solves.**       
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 69 6e 74 6f 2e 20 20 46 6f 72 20 74 65 73    into.  For tes
3d00: 74 69 6e 67 20 28 53 51 4c 49 54 45 5f 44 45 42  ting (SQLITE_DEB
3d10: 55 47 29 2c 20 75 6e 72 65 73 6f 6c 76 65 64 0a  UG), unresolved.
3d20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3d30: 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c             label
3d40: 73 20 73 74 6f 72 65 73 20 2d 31 2c 20 62 75 74  s stores -1, but
3d50: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 72 65 71   that is not req
3d60: 75 69 72 65 64 2e 0a 2a 2a 20 20 20 20 20 50 61  uired..**     Pa
3d70: 72 73 65 2e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20  rse.nLabelAlloc 
3d80: 20 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74    Number of slot
3d90: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 50  s allocated to P
3da0: 61 72 73 65 2e 61 4c 61 62 65 6c 5b 5d 0a 2a 2a  arse.aLabel[].**
3db0: 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61 62 65       Parse.nLabe
3dc0: 6c 20 20 20 20 20 20 20 20 54 68 65 20 2a 6e 65  l        The *ne
3dd0: 67 61 74 69 76 65 2a 20 6f 66 20 74 68 65 20 6e  gative* of the n
3de0: 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c 73 20  umber of labels 
3df0: 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 62 65 65 6e 20 69 73 73 75 65 64       been issued
3e20: 2e 20 20 54 68 65 20 6e 65 67 61 74 69 76 65 20  .  The negative 
3e30: 69 73 20 73 74 6f 72 65 64 20 62 65 63 61 75 73  is stored becaus
3e40: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
3e60: 74 20 67 69 76 65 73 20 61 20 70 65 72 66 6f 72  t gives a perfor
3e70: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
3e80: 74 20 6f 76 65 72 20 73 74 6f 72 69 6e 67 0a 2a  t over storing.*
3e90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
3ea0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 65 71            the eq
3eb0: 75 69 76 61 6c 65 6e 74 20 70 6f 73 69 74 69 76  uivalent positiv
3ec0: 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20  e value..*/.int 
3ed0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
3ee0: 61 62 65 6c 28 50 61 72 73 65 20 2a 70 50 61 72  abel(Parse *pPar
3ef0: 73 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 2d 2d  se){.  return --
3f00: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3b 0a  pParse->nLabel;.
3f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
3f20: 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65   label "x" to be
3f30: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
3f40: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
3f50: 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e  tion to.** be in
3f60: 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72  serted.  The par
3f70: 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20  ameter "x" must 
3f80: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
3f90: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69  ed from.** a pri
3fa0: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
3fb0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
3fc0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  )..*/.static SQL
3fd0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
3fe0: 64 20 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c  d resizeResolveL
3ff0: 61 62 65 6c 28 50 61 72 73 65 20 2a 70 2c 20 56  abel(Parse *p, V
4000: 64 62 65 20 2a 76 2c 20 69 6e 74 20 6a 29 7b 0a  dbe *v, int j){.
4010: 20 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d    int nNewSize =
4020: 20 31 30 20 2d 20 70 2d 3e 6e 4c 61 62 65 6c 3b   10 - p->nLabel;
4030: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73  .  p->aLabel = s
4040: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
4050: 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  rFree(p->db, p->
4060: 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  aLabel,.        
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 65               nNe
4080: 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70 2d 3e  wSize*sizeof(p->
4090: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 69  aLabel[0]));.  i
40a0: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20  f( p->aLabel==0 
40b0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c  ){.    p->nLabel
40c0: 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  Alloc = 0;.  }el
40d0: 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
40e0: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20  E_DEBUG.    int 
40f0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  i;.    for(i=p->
4100: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20 69 3c 6e  nLabelAlloc; i<n
4110: 4e 65 77 53 69 7a 65 3b 20 69 2b 2b 29 20 70 2d  NewSize; i++) p-
4120: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
4130: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 6e  .#endif.    p->n
4140: 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 6e 4e 65  LabelAlloc = nNe
4150: 77 53 69 7a 65 3b 0a 20 20 20 20 70 2d 3e 61 4c  wSize;.    p->aL
4160: 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70  abel[j] = v->nOp
4170: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
4180: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
4190: 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e  abel(Vdbe *v, in
41a0: 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  t x){.  Parse *p
41b0: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
41c0: 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b  int j = ADDR(x);
41d0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
41e0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
41f0: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
4200: 28 20 6a 3c 2d 70 2d 3e 6e 4c 61 62 65 6c 20 29  ( j<-p->nLabel )
4210: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30  ;.  assert( j>=0
4220: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
4230: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d  E_DEBUG.  if( p-
4240: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
4250: 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
4260: 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
4270: 28 22 52 45 53 4f 4c 56 45 20 4c 41 42 45 4c 20  ("RESOLVE LABEL 
4280: 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 78 2c 20  %d to %d\n", x, 
4290: 76 2d 3e 6e 4f 70 29 3b 0a 20 20 7d 0a 23 65 6e  v->nOp);.  }.#en
42a0: 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 61  dif.  if( p->nLa
42b0: 62 65 6c 41 6c 6c 6f 63 20 2b 20 70 2d 3e 6e 4c  belAlloc + p->nL
42c0: 61 62 65 6c 20 3c 20 30 20 29 7b 0a 20 20 20 20  abel < 0 ){.    
42d0: 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c 61 62  resizeResolveLab
42e0: 65 6c 28 70 2c 76 2c 6a 29 3b 0a 20 20 7d 65 6c  el(p,v,j);.  }el
42f0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4300: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d 28 2d  p->aLabel[j]==(-
4310: 31 29 20 29 3b 20 2f 2a 20 4c 61 62 65 6c 73 20  1) ); /* Labels 
4320: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65 73 6f  may only be reso
4330: 6c 76 65 64 20 6f 6e 63 65 20 2a 2f 0a 20 20 20  lved once */.   
4340: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
4350: 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  v->nOp;.  }.}../
4360: 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44  *.** Mark the VD
4370: 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63  BE as one that c
4380: 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f  an only be run o
4390: 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  ne time..*/.void
43a0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f   sqlite3VdbeRunO
43b0: 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29  nlyOnce(Vdbe *p)
43c0: 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  {.  p->runOnlyOn
43d0: 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 1;.}../*.**
43e0: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
43f0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
4400: 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c 74 69  nly be run multi
4410: 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f  ple times..*/.vo
4420: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
4430: 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b  usable(Vdbe *p){
4440: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
4450: 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 0;.}..#ifdef
4460: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
4470: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
4480: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
4490: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
44a0: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
44b0: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
44c0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
44d0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
44e0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
44f0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
4500: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
4510: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
4520: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
4530: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
4540: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
4550: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
4560: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
4570: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
4580: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
4590: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
45a0: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
45b0: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
45c0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
45f0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
4600: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
4610: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
4620: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
4630: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
4640: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
4650: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
4660: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
4670: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
4680: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
4690: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
46a0: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
46b0: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
46c0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
46e0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
46f0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
4700: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
4710: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
4720: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
4730: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
4740: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4760: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
4770: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
4780: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
4790: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
47a0: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
47b0: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
47c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
47f0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
4800: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
4810: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
4820: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
4830: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
4840: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
4850: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
4860: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
4870: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
4880: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
4890: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
48a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
48b0: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
48c0: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
48d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
48e0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
48f0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
4900: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
4910: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
4920: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
4930: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
4940: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
4950: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
4960: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
4970: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
4980: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
4990: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
49a0: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
49b0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
49c0: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
49d0: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
49e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
49f0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
4a00: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
4a10: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
4a20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
4a30: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
4a40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
4a50: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
4a60: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
4a70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4a80: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
4a90: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
4aa0: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
4ab0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
4ac0: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
4ad0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
4ae0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
4af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
4b00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
4b10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
4b20: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
4b30: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
4b40: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
4b50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
4b60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
4b70: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
4b80: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
4b90: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
4ba0: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
4bb0: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
4bc0: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
4bd0: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
4be0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
4bf0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
4c00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4c10: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
4c20: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
4c30: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
4c40: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
4c50: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
4c60: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
4c70: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
4c80: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
4c90: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
4ca0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
4cb0: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
4cc0: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
4cd0: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
4ce0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
4cf0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
4d00: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
4d10: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
4d20: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
4d30: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
4d40: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
4d50: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
4d60: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
4d70: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
4d80: 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74  **   *  OP_Creat
4d90: 65 42 74 72 65 65 2f 42 54 52 45 45 5f 49 4e 54  eBtree/BTREE_INT
4da0: 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43  KEY and OP_InitC
4db0: 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 20 20 20  oroutine .**    
4dc0: 20 20 28 66 6f 72 20 43 52 45 41 54 45 20 54 41    (for CREATE TA
4dd0: 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  BLE AS SELECT ..
4de0: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68  .).**.** Then ch
4df0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
4e00: 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41  ue of Parse.mayA
4e10: 62 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20  bort is true if 
4e20: 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20  an.** ABORT may 
4e30: 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61  be thrown, or fa
4e40: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52  lse otherwise. R
4e50: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
4e60: 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20   does.** match, 
4e70: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
4e80: 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
4e90: 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  n is intended to
4ea0: 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70   be used as.** p
4eb0: 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74  art of an assert
4ec0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
4ed0: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69  e compiler. Simi
4ee0: 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
4ef0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
4f00: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
4f10: 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  t(pParse->pVdbe,
4f20: 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72   pParse->mayAbor
4f30: 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c  t) );.*/.int sql
4f40: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
4f50: 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20  yAbort(Vdbe *v, 
4f60: 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20  int mayAbort){. 
4f70: 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20   int hasAbort = 
4f80: 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f  0;.  int hasFkCo
4f90: 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  unter = 0;.  int
4fa0: 20 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20   hasCreateTable 
4fb0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72  = 0;.  int hasCr
4fc0: 65 61 74 65 49 6e 64 65 78 20 3d 20 30 3b 0a 20  eateIndex = 0;. 
4fd0: 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f   int hasInitCoro
4fe0: 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20  utine = 0;.  Op 
4ff0: 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74  *pOp;.  VdbeOpIt
5000: 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73  er sIter;.  mems
5010: 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69  et(&sIter, 0, si
5020: 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20  zeof(sIter));.  
5030: 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20  sIter.v = v;..  
5040: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
5050: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
5060: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
5070: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
5080: 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70  code;.    if( op
5090: 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79  code==OP_Destroy
50a0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
50b0: 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65  Update || opcode
50c0: 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20  ==OP_VRename .  
50d0: 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50     || opcode==OP
50e0: 5f 56 44 65 73 74 72 6f 79 0a 20 20 20 20 20 7c  _VDestroy.     |
50f0: 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 61  | (opcode==OP_Pa
5100: 72 73 65 53 63 68 65 6d 61 20 26 26 20 70 4f 70  rseSchema && pOp
5110: 2d 3e 70 34 2e 7a 3d 3d 30 29 0a 20 20 20 20 20  ->p4.z==0).     
5120: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  || ((opcode==OP_
5130: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  Halt || opcode==
5140: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a  OP_HaltIfNull) .
5150: 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e        && ((pOp->
5160: 70 31 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  p1)!=SQLITE_OK &
5170: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
5180: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
5190: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
51a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
51b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
51c0: 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74 72  de==OP_CreateBtr
51d0: 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 42  ee && pOp->p3==B
51e0: 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20 68 61  TREE_INTKEY ) ha
51f0: 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31  sCreateTable = 1
5200: 3b 0a 20 20 20 20 69 66 28 20 6d 61 79 41 62 6f  ;.    if( mayAbo
5210: 72 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 68  rt ){.      /* h
5220: 61 73 43 72 65 61 74 65 49 6e 64 65 78 20 6d 61  asCreateIndex ma
5230: 79 20 61 6c 73 6f 20 62 65 20 73 65 74 20 66 6f  y also be set fo
5240: 72 20 73 6f 6d 65 20 44 45 4c 45 54 45 20 73 74  r some DELETE st
5250: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
5260: 65 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6c  e.      ** OP_Cl
5270: 65 61 72 2e 20 53 6f 20 74 68 69 73 20 72 6f 75  ear. So this rou
5280: 74 69 6e 65 20 6d 61 79 20 65 6e 64 20 75 70 20  tine may end up 
5290: 72 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 69  returning true i
52a0: 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
52b0: 20 20 2a 2a 20 77 68 65 72 65 20 61 20 22 44 45    ** where a "DE
52c0: 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 22 20 68  LETE FROM tbl" h
52d0: 61 73 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 6a  as a statement-j
52e0: 6f 75 72 6e 61 6c 20 62 75 74 20 64 6f 65 73 20  ournal but does 
52f0: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71  not.      ** req
5300: 75 69 72 65 20 6f 6e 65 2e 20 54 68 69 73 20 69  uire one. This i
5310: 73 20 6e 6f 74 20 73 6f 20 62 61 64 20 2d 20 69  s not so bad - i
5320: 74 20 69 73 20 61 6e 20 69 6e 65 66 66 69 63 69  t is an ineffici
5330: 65 6e 63 79 2c 20 6e 6f 74 20 61 20 62 75 67 2e  ency, not a bug.
5340: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 70   */.      if( op
5350: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42  code==OP_CreateB
5360: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d  tree && pOp->p3=
5370: 3d 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 29  =BTREE_BLOBKEY )
5380: 20 68 61 73 43 72 65 61 74 65 49 6e 64 65 78 20   hasCreateIndex 
5390: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  = 1;.      if( o
53a0: 70 63 6f 64 65 3d 3d 4f 50 5f 43 6c 65 61 72 20  pcode==OP_Clear 
53b0: 29 20 68 61 73 43 72 65 61 74 65 49 6e 64 65 78  ) hasCreateIndex
53c0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
53d0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  if( opcode==OP_I
53e0: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68  nitCoroutine ) h
53f0: 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  asInitCoroutine 
5400: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
5410: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
5420: 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63  _KEY.    if( opc
5430: 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65  ode==OP_FkCounte
5440: 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20  r && pOp->p1==0 
5450: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b  && pOp->p2==1 ){
5460: 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e  .      hasFkCoun
5470: 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ter = 1;.    }.#
5480: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
5490: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
54a0: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
54b0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
54c0: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
54d0: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
54e0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
54f0: 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66  ccurred..  ** If
5500: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
5510: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
5520: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
5530: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
5540: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
5550: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
5560: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
5570: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
5580: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
5590: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
55a0: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
55b0: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
55c0: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
55d0: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
55e0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
55f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5600: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
5610: 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b  ayAbort || hasFk
5620: 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20  Counter.        
5630: 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54 61 62  || (hasCreateTab
5640: 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72  le && hasInitCor
5650: 6f 75 74 69 6e 65 29 20 7c 7c 20 68 61 73 43 72  outine) || hasCr
5660: 65 61 74 65 49 6e 64 65 78 0a 20 20 29 3b 0a 7d  eateIndex.  );.}
5670: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5680: 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71  E_DEBUG - the sq
5690: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
56a0: 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a  ort() function *
56b0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
56c0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e 63  _DEBUG./*.** Inc
56d0: 72 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69 74  rement the nWrit
56e0: 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68 65  e counter in the
56f0: 20 56 44 42 45 20 69 66 20 74 68 65 20 63 75 72   VDBE if the cur
5700: 73 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a 2a  sor is not an.**
5710: 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f   ephemeral curso
5720: 72 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75 72  r, or if the cur
5730: 73 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  sor argument is 
5740: 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  NULL..*/.void sq
5750: 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69  lite3VdbeIncrWri
5760: 74 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20 2a  teCounter(Vdbe *
5770: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
5780: 43 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30 0a  C){.  if( pC==0.
5790: 20 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72 54     || (pC->eCurT
57a0: 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52  ype!=CURTYPE_SOR
57b0: 54 45 52 0a 20 20 20 20 20 20 20 26 26 20 70 43  TER.       && pC
57c0: 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54  ->eCurType!=CURT
57d0: 59 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20 20  YPE_PSEUDO.     
57e0: 20 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68 65    && !pC->isEphe
57f0: 6d 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20 20  meral).  ){.    
5800: 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 7d  p->nWrite++;.  }
5810: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
5820: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
5830: 2a 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20 61  *.** Assert if a
5840: 6e 20 41 62 6f 72 74 20 61 74 20 74 68 69 73 20  n Abort at this 
5850: 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d 69  point in time mi
5860: 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ght result in a 
5870: 63 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61 62  corrupt.** datab
5880: 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
5890: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41 62  ite3VdbeAssertAb
58a0: 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70 29  ortable(Vdbe *p)
58b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
58c0: 57 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e 75  Write==0 || p->u
58d0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
58e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
58f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5900: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
5910: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
5920: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  been inserted.  
5930: 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f  It loops.** thro
5940: 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f  ugh all the opco
5950: 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70  des and fixes up
5960: 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a   some details..*
5970: 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63  *.** (1) For eac
5980: 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  h jump instructi
5990: 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69  on with a negati
59a0: 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c  ve P2 value (a l
59b0: 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73  abel).**     res
59c0: 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75  olve the P2 valu
59d0: 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61  e to an actual a
59e0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32  ddress..**.** (2
59f0: 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  ) Compute the ma
5a00: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
5a10: 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62  arguments used b
5a20: 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69  y any SQL functi
5a30: 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74  on.**     and st
5a40: 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69  ore that value i
5a50: 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e  n *pMaxFuncArgs.
5a60: 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74  .**.** (3) Updat
5a70: 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f  e the Vdbe.readO
5a80: 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73  nly and Vdbe.bIs
5a90: 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20  Reader flags to 
5aa0: 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20  accurately.**   
5ab0: 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20    indicate what 
5ac0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
5ad0: 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20  tement actually 
5ae0: 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20  does..**.** (4) 
5af0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70  Initialize the p
5b00: 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74  4.xAdvance point
5b10: 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68  er on opcodes th
5b20: 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  at use it..**.**
5b30: 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65   (5) Reclaim the
5b40: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
5b50: 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61  d for storing la
5b60: 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bels..**.** This
5b70: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
5b80: 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72  ly function corr
5b90: 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f  ectly if the mko
5ba0: 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72  pcodeh.tcl gener
5bb0: 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e  ator.** script n
5bc0: 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64  umbers the opcod
5bd0: 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43  es correctly.  C
5be0: 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72  hanges to this r
5bf0: 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a  outine must be.*
5c00: 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69  * coordinated wi
5c10: 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b  th changes to mk
5c20: 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a  opcodeh.tcl..*/.
5c30: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
5c40: 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65  lveP2Values(Vdbe
5c50: 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75   *p, int *pMaxFu
5c60: 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e  ncArgs){.  int n
5c70: 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46  MaxArgs = *pMaxF
5c80: 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70  uncArgs;.  Op *p
5c90: 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  Op;.  Parse *pPa
5ca0: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
5cb0: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
5cc0: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b   pParse->aLabel;
5cd0: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  .  p->readOnly =
5ce0: 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64   1;.  p->bIsRead
5cf0: 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20  er = 0;.  pOp = 
5d00: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31  &p->aOp[p->nOp-1
5d10: 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a  ];.  while(1){..
5d20: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50      /* Only JUMP
5d30: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65   opcodes and the
5d40: 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73   short list of s
5d50: 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69  pecial opcodes i
5d60: 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20 20  n the switch.   
5d70: 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74   ** below need t
5d80: 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e  o be considered.
5d90: 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e    The mkopcodeh.
5da0: 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63  tcl generator sc
5db0: 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20  ript groups.    
5dc0: 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63  ** all these opc
5dd0: 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65  odes together ne
5de0: 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20  ar the front of 
5df0: 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e  the opcode list.
5e00: 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e    Skip.    ** an
5e10: 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f  y opcode that do
5e20: 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63  es not need proc
5e30: 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75 61  essing by virtua
5e40: 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  l of the fact th
5e50: 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  at.    ** it is 
5e60: 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49  larger than SQLI
5e70: 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44  TE_MX_JUMP_OPCOD
5e80: 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  E, as a performa
5e90: 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
5ea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5eb0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51   pOp->opcode<=SQ
5ec0: 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43  LITE_MX_JUMP_OPC
5ed0: 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ODE ){.      /* 
5ee0: 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f  NOTE: Be sure to
5ef0: 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65   update mkopcode
5f00: 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e  h.tcl when addin
5f10: 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20  g or removing.  
5f20: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
5f30: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
5f40: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
5f50: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20  pOp->opcode ){. 
5f60: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54         case OP_T
5f70: 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20  ransaction: {.  
5f80: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
5f90: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
5fa0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
5fb0: 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75      /* fall thru
5fc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
5fd0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
5fe0: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
5ff0: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
6000: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  int: {.         
6010: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
6020: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
6030: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ak;.        }.#i
6040: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6050: 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61  T_WAL.        ca
6060: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
6070: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  :.#endif.       
6080: 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a   case OP_Vacuum:
6090: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
60a0: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a  _JournalMode: {.
60b0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61            p->rea
60c0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
60d0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
60e0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
60f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6100: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
6110: 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20 20  P_Next:.        
6120: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
6130: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  xt: {.          
6140: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
6150: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
6160: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
6170: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
6180: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
6190: 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67     /* The code g
61a0: 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63  enerator never c
61b0: 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73  odes any of thes
61c0: 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a  e opcodes as a j
61d0: 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ump.          **
61e0: 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68   to a label.  Th
61f0: 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f  ey are always co
6200: 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61  ded as a jump ba
6210: 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20  ckwards to a .  
6220: 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e          ** known
6230: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20   address */.    
6240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
6250: 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20  p->p2>=0 );.    
6260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
6280: 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a 20  ase OP_Prev: {. 
6290: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
62a0: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
62b0: 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
62c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
62d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
62e0: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ANCE;.          
62f0: 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
6300: 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65  rator never code
6310: 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f  s any of these o
6320: 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70  pcodes as a jump
6330: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
6340: 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20   a label.  They 
6350: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64  are always coded
6360: 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77   as a jump backw
6370: 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20  ards to a .     
6380: 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64       ** known ad
6390: 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20  dress */.       
63a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
63b0: 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  p2>=0 );.       
63c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
63d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
63e0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
63f0: 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61 73  ABLE.        cas
6400: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
6410: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
6420: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
6430: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
6440: 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >p2;.          b
6450: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6460: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
6470: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
6480: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
6490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
64a0: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20  Op - p->aOp) >= 
64b0: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  3 );.          a
64c0: 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
64d0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65  pcode==OP_Intege
64e0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  r );.          n
64f0: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
6500: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e           if( n>n
6510: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
6520: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
6530: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
6540: 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61 75  h into the defau
6550: 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  lt case */.     
6560: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6570: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
6580: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
6590: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
65a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f        /* The mko
65b0: 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70  pcodeh.tcl scrip
65c0: 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65  t has so arrange
65d0: 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68  d things that th
65e0: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 20  e only.         
65f0: 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f     ** non-jump o
6600: 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e  pcodes less than
6610: 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f   SQLITE_MX_JUMP_
6620: 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74  CODE are guarant
6630: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
6640: 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e     ** have non-n
6650: 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 66  egative values f
6660: 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20  or P2. */.      
6670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 73        assert( (s
6680: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
6690: 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  erty[pOp->opcode
66a0: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
66b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
66c0: 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28 70    assert( ADDR(p
66d0: 4f 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73 65 2d  Op->p2)<-pParse-
66e0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
66f0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6700: 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70   aLabel[ADDR(pOp
6710: 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20 20  ->p2)];.        
6720: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
6730: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
6740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
6750: 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63  The mkopcodeh.tc
6760: 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20  l script has so 
6770: 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20  arranged things 
6780: 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20  that the only.  
6790: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
67a0: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
67b0: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
67c0: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
67d0: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  teed to.      **
67e0: 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69   have non-negati
67f0: 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32  ve values for P2
6800: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
6810: 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  t( (sqlite3Opcod
6820: 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f  eProperty[pOp->o
6830: 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d  pcode]&OPFLG_JUM
6840: 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32  P)==0 || pOp->p2
6850: 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >=0);.    }.    
6860: 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20  if( pOp==p->aOp 
6870: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70  ) break;.    pOp
6880: 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  --;.  }.  sqlite
6890: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
68a0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a  Parse->aLabel);.
68b0: 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c    pParse->aLabel
68c0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
68d0: 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70  nLabel = 0;.  *p
68e0: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
68f0: 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74  axArgs;.  assert
6900: 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d  ( p->bIsReader!=
6910: 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65  0 || DbMaskAllZe
6920: 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  ro(p->btreeMask)
6930: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
6940: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
6950: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
6960: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
6970: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
6980: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
6990: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
69a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
69b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
69c0: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
69d0: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
69e0: 20 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20   Verify that at 
69f0: 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73  least N opcode s
6a00: 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62  lots are availab
6a10: 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a  le in p without.
6a20: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c  ** having to mal
6a30: 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61  loc for more spa
6a40: 63 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20  ce (except when 
6a50: 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a  compiled using.*
6a60: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  * SQLITE_TEST_RE
6a70: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20  ALLOC_STRESS).  
6a80: 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69  This interface i
6a90: 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
6aa0: 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69  sting.** to veri
6ab0: 66 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  fy that certain 
6ac0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
6ad0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20  VdbeAddOpList() 
6ae0: 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69  can never.** fai
6af0: 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66  l due to a OOM f
6b00: 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74  ault and hence t
6b10: 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76  hat the return v
6b20: 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  alue from.** sql
6b30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
6b40: 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  t() will always 
6b50: 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a  be non-NULL..*/.
6b60: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6b70: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
6b80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
6b90: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
6ba0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
6bb0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
6bc0: 52 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70  Required(Vdbe *p
6bd0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
6be0: 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c  rt( p->nOp + N <
6bf0: 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b  = p->nOpAlloc );
6c00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6c10: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
6c20: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68   VM passed as th
6c30: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
6c40: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
6c50: 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74  .** an OP_Result
6c60: 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c  Row opcode. Fail
6c70: 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20   an assert() if 
6c80: 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73  it does. This is
6c90: 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65   used.** by code
6ca0: 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20   in pragma.c to 
6cb0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
6cc0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
6cd0: 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61  f certain.** pra
6ce0: 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69  gmas comports wi
6cf0: 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65  th the flags spe
6d00: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b  cified in the mk
6d10: 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a  pragmatab.tcl.**
6d20: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20   script..*/.#if 
6d30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6d40: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
6d50: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
6d60: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
6d70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
6d80: 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28  rifyNoResultRow(
6d90: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6da0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
6db0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
6dc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
6dd0: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52  [i].opcode!=OP_R
6de0: 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a  esultRow );.  }.
6df0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
6e00: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 61  Generate code (a
6e10: 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72 74   single OP_Abort
6e20: 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68 61  able opcode) tha
6e30: 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66 79  t will.** verify
6e40: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 70   that the VDBE p
6e50: 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65 6c  rogram can safel
6e60: 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e 20  y call Abort in 
6e70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
6e80: 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20 64  ontext..*/.#if d
6e90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6ea0: 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  BUG).void sqlite
6eb0: 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74  3VdbeVerifyAbort
6ec0: 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  able(Vdbe *p, in
6ed0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69 66  t onError){.  if
6ee0: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
6ef0: 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  ort ) sqlite3Vdb
6f00: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41 62  eAddOp0(p, OP_Ab
6f10: 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e 64  ortable);.}.#end
6f20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
6f30: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
6f40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6f50: 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65   array of opcode
6f60: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
6f70: 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61  h.** the Vdbe pa
6f80: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
6f90: 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69  t argument. It i
6fa0: 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
6fb0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
6fc0: 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74  to arrange for t
6fd0: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61  he returned arra
6fe0: 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c  y to be eventual
6ff0: 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74  ly freed using t
7000: 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f  he .** vdbeFreeO
7010: 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f  pArray() functio
7020: 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  n..**.** Before 
7030: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70  returning, *pnOp
7040: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
7050: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
7060: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
7070: 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c  .** array. Also,
7080: 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65   *pnMaxArg is se
7090: 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20  t to the larger 
70a0: 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  of its current v
70b0: 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65  alue and .** the
70c0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
70d0: 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  es in the Vdbe.a
70e0: 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71  pArg[] array req
70f0: 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65  uired to execute
7100: 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65   the .** returne
7110: 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64  d program..*/.Vd
7120: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
7130: 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62  eTakeOpArray(Vdb
7140: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c  e *p, int *pnOp,
7150: 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b   int *pnMaxArg){
7160: 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d  .  VdbeOp *aOp =
7170: 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72   p->aOp;.  asser
7180: 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62  t( aOp && !p->db
7190: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
71a0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
71b0: 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  at sqlite3VdbeUs
71c0: 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f  esBtree() was no
71d0: 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  t called on this
71e0: 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   VM */.  assert(
71f0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
7200: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
7210: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
7220: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
7230: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
7240: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
7250: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
7260: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
7270: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
7280: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
7290: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
72a0: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  Return a.** poin
72b0: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
72c0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72   operation inser
72d0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a  ted..**.** Non-z
72e0: 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73  ero P2 arguments
72f0: 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   to jump instruc
7300: 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61  tions are automa
7310: 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64  tically adjusted
7320: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
7330: 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20 72  jump target is r
7340: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66  elative to the f
7350: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69  irst operation i
7360: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65  nserted..*/.Vdbe
7370: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  Op *sqlite3VdbeA
7380: 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65  ddOpList(.  Vdbe
7390: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
73a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
73b0: 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70  opcodes to the p
73c0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
73d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20  t */.  int nOp, 
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7400: 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20   opcodes to add 
7410: 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20  */.  VdbeOpList 
7420: 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20  const *aOp,     
7430: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73    /* The opcodes
7440: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
7450: 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20    int iLineno   
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7470: 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69  * Source-file li
7480: 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72  ne number of fir
7490: 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a  st opcode */.){.
74a0: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
74b0: 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74  p *pOut, *pFirst
74c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e  ;.  assert( nOp>
74d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
74e0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
74f0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
7500: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
7510: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20   p->nOpAlloc && 
7520: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e  growOpArray(p, n
7530: 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Op) ){.    retur
7540: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73  n 0;.  }.  pFirs
7550: 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  t = pOut = &p->a
7560: 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f  Op[p->nOp];.  fo
7570: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
7580: 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b  +, aOp++, pOut++
7590: 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  ){.    pOut->opc
75a0: 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64  ode = aOp->opcod
75b0: 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  e;.    pOut->p1 
75c0: 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70  = aOp->p1;.    p
75d0: 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70  Out->p2 = aOp->p
75e0: 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  2;.    assert( a
75f0: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
7600: 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63   if( (sqlite3Opc
7610: 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d  odeProperty[aOp-
7620: 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47  >opcode] & OPFLG
7630: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70  _JUMP)!=0 && aOp
7640: 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20  ->p2>0 ){.      
7650: 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e  pOut->p2 += p->n
7660: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  Op;.    }.    pO
7670: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
7680: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
7690: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
76a0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
76b0: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
76c0: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
76d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
76e0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
76f0: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
7700: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
7710: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
7720: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
7730: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
7740: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
7750: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
7760: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
7770: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
7780: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
7790: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
77a0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
77b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
77c0: 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70  ntOp(0, i+p->nOp
77d0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e  , &p->aOp[i+p->n
77e0: 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Op]);.    }.#end
77f0: 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20  if.  }.  p->nOp 
7800: 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e  += nOp;.  return
7810: 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20   pFirst;.}..#if 
7820: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
7830: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
7840: 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64  TATUS)./*.** Add
7850: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
7860: 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65   array of counte
7870: 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71  rs managed by sq
7880: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
7890: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  tatus()..*/.void
78a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e   sqlite3VdbeScan
78b0: 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a  Status(.  Vdbe *
78c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
78d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20            /* VM 
78e0: 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75  to add scanstatu
78f0: 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  s() to */.  int 
7900: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20  addrExplain,    
7910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7920: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70  ddress of OP_Exp
7930: 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20  lain (or 0) */. 
7940: 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20   int addrLoop,  
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c   /* Address of l
7970: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a  oop counter */ .
7980: 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c    int addrVisit,
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
79b0: 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75  rows visited cou
79c0: 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  nter */.  LogEst
79d0: 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20   nEst,          
79e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
79f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
7a00: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
7a10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
7a20: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
7a30: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
7a40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e  le or index bein
7a50: 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a  g scanned */.){.
7a60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
7a70: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61  nByte = (p->nSca
7a80: 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63  n+1) * sizeof(Sc
7a90: 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61  anStatus);.  Sca
7aa0: 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20  nStatus *aNew;. 
7ab0: 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61   aNew = (ScanSta
7ac0: 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65  tus*)sqlite3DbRe
7ad0: 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e  alloc(p->db, p->
7ae0: 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20  aScan, nByte);. 
7af0: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
7b00: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65   ScanStatus *pNe
7b10: 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63  w = &aNew[p->nSc
7b20: 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  an++];.    pNew-
7b30: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61  >addrExplain = a
7b40: 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
7b50: 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d  pNew->addrLoop =
7b60: 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70   addrLoop;.    p
7b70: 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d  New->addrVisit =
7b80: 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20   addrVisit;.    
7b90: 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73  pNew->nEst = nEs
7ba0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  t;.    pNew->zNa
7bb0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7bc0: 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d  rDup(p->db, zNam
7bd0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e  e);.    p->aScan
7be0: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23   = aNew;.  }.}.#
7bf0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
7c00: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
7c10: 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72  f the opcode, or
7c20: 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20   P1, P2, P3, or 
7c30: 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66  P5 operands.** f
7c40: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
7c50: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
7c60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7c70: 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20  angeOpcode(Vdbe 
7c80: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 75 38  *p, int addr, u8
7c90: 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20   iNewOpcode){.  
7ca0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
7cb0: 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65  (p,addr)->opcode
7cc0: 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d   = iNewOpcode;.}
7cd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7ce0: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
7cf0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
7d00: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
7d10: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
7d20: 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p1 = val;.}.v
7d30: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
7d40: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
7d50: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
7d60: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
7d70: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
7d80: 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p2 = val;.}.voi
7d90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
7da0: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69  ngeP3(Vdbe *p, i
7db0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
7dc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
7dd0: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
7de0: 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  3 = val;.}.void 
7df0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7e00: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36  eP5(Vdbe *p, u16
7e10: 20 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20   p5){.  assert( 
7e20: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64  p->nOp>0 || p->d
7e30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7e40: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
7e50: 30 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  0 ) p->aOp[p->nO
7e60: 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a  p-1].p5 = p5;.}.
7e70: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
7e80: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
7e90: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
7ea0: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
7eb0: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
7ec0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
7ed0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
7ee0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
7ef0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
7f00: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
7f10: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
7f20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
7f30: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
7f40: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
7f50: 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66  he input FuncDef
7f60: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70   structure is ep
7f70: 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72  hemeral, then fr
7f80: 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  ee it.  If.** th
7f90: 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74  e FuncDef is not
7fa0: 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20   ephermal, then 
7fb0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73  do nothing..*/.s
7fc0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45  tatic void freeE
7fd0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
7fe0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
7ff0: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
8000: 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
8010: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
8020: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
8030: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8040: 65 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  eNN(db, pDef);. 
8050: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
8060: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
8070: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
8080: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
8090: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
80a0: 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a 64 62  4Mem(sqlite3 *db
80b0: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28  , Mem *p){.  if(
80c0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
80d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
80e0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
80f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
8100: 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63  db, p);.}.static
8110: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
8120: 20 76 6f 69 64 20 66 72 65 65 50 34 46 75 6e 63   void freeP4Func
8130: 43 74 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Ctx(sqlite3 *db,
8140: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8150: 20 2a 70 29 7b 0a 20 20 66 72 65 65 45 70 68 65   *p){.  freeEphe
8160: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
8170: 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 73  , p->pFunc);.  s
8180: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
8190: 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20  b, p);.}.static 
81a0: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
81b0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
81c0: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
81d0: 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a    assert( db );.
81e0: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
81f0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
8200: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
8210: 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 64   freeP4FuncCtx(d
8220: 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b, (sqlite3_cont
8230: 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  ext*)p4);.      
8240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8250: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
8260: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
8270: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44 59  :.    case P4_DY
8280: 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73 65 20  NAMIC:.    case 
8290: 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20  P4_DYNBLOB:.    
82a0: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
82b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
82c0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
82d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
82e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
82f0: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
8300: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
8310: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
8320: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28  e3KeyInfoUnref((
8330: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20  KeyInfo*)p4);.  
8340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8360: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
8370: 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45  TS.    case P4_E
8380: 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  XPR: {.      sql
8390: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
83a0: 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a 20  b, (Expr*)p4);. 
83b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
83c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
83d0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
83e0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
83f0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
8400: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
8410: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8420: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
8430: 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64  M: {.      if( d
8440: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
8450: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
8460: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
8470: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
8480: 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  4);.      }else{
8490: 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 34 4d  .        freeP4M
84a0: 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29  em(db, (Mem*)p4)
84b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
84c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
84d0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
84e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
84f0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
8500: 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c  ) sqlite3VtabUnl
8510: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34  ock((VTable *)p4
8520: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8530: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8540: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
8550: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
8560: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
8570: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
8580: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
8590: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
85a0: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
85b0: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
85c0: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
85d0: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
85e0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
85f0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
8600: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
8610: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
8620: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
8630: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
8640: 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70  for(pOp=&aOp[nOp
8650: 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20 70  -1]; pOp>=aOp; p
8660: 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Op--){.      if(
8670: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c 3d 20   pOp->p4type <= 
8680: 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20 29 20  P4_FREE_IF_LE ) 
8690: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
86a0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
86b0: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
86c0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
86d0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
86e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
86f0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
8700: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
8710: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
8720: 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f 70 29  bFreeNN(db, aOp)
8730: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
8740: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
8750: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
8760: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
8770: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
8780: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
8790: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
87a0: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
87b0: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
87c0: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
87d0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
87e0: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
87f0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
8800: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
8810: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
8820: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
8830: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
8840: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
8850: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
8860: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
8870: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
8880: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
8890: 69 76 65 6e 20 56 64 62 65 20 68 61 73 20 61 6e  iven Vdbe has an
88a0: 79 20 53 75 62 50 72 6f 67 72 61 6d 73 2e 0a 2a  y SubPrograms..*
88b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
88c0: 65 48 61 73 53 75 62 50 72 6f 67 72 61 6d 28 56  eHasSubProgram(V
88d0: 64 62 65 20 2a 70 56 64 62 65 29 7b 0a 20 20 72  dbe *pVdbe){.  r
88e0: 65 74 75 72 6e 20 70 56 64 62 65 2d 3e 70 50 72  eturn pVdbe->pPr
88f0: 6f 67 72 61 6d 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  ogram!=0;.}../*.
8900: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70  ** Change the op
8910: 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e 74  code at addr int
8920: 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74  o OP_Noop.*/.int
8930: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8940: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
8950: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56  , int addr){.  V
8960: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
8970: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
8980: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
8990: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
89a0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
89b0: 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op );.  pOp = &p
89c0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66  ->aOp[addr];.  f
89d0: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70  reeP4(p->db, pOp
89e0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
89f0: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74  4.p);.  pOp->p4t
8a00: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
8a10: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20  ;.  pOp->p4.z = 
8a20: 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  0;.  pOp->opcode
8a30: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65   = OP_Noop;.  re
8a40: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
8a50: 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63   If the last opc
8a60: 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20  ode is "op" and 
8a70: 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70  it is not a jump
8a80: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a   destination,.**
8a90: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e   then remove it.
8aa0: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
8ab0: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20   and only if an 
8ac0: 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76  opcode was remov
8ad0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8ae0: 65 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f  e3VdbeDeletePrio
8af0: 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c  rOpcode(Vdbe *p,
8b00: 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 70   u8 op){.  if( p
8b10: 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f  ->nOp>0 && p->aO
8b20: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f  p[p->nOp-1].opco
8b30: 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65  de==op ){.    re
8b40: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
8b50: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20  ChangeToNoop(p, 
8b60: 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c  p->nOp-1);.  }el
8b70: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
8b80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
8b90: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
8ba0: 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  of the P4 operan
8bb0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
8bc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
8bd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8be0: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
8bf0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
8c00: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
8c10: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
8c20: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
8c30: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
8c40: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
8c50: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
8c60: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
8c70: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
8c80: 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70  0 then the P4 op
8c90: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
8ca0: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
8cb0: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
8cc0: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
8cd0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
8ce0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
8cf0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20  _malloc()..** A 
8d00: 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65  value of n==0 me
8d10: 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f  ans copy bytes o
8d20: 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20  f zP4 up to and 
8d30: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a  including the.**
8d40: 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65   first null byte
8d50: 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63  .  If n>0 then c
8d60: 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66  opy n+1 bytes of
8d70: 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68   zP4..** .** Oth
8d80: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
8d90: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
8da0: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
8db0: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
8dc0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
8dd0: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
8de0: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
8df0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
8e00: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
8e10: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
8e20: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
8e30: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
8e40: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
8e50: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
8e60: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
8e70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
8e80: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
8e90: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
8ea0: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
8eb0: 49 4e 45 20 76 64 62 65 43 68 61 6e 67 65 50 34  INE vdbeChangeP4
8ec0: 46 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c  Full(.  Vdbe *p,
8ed0: 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f  .  Op *pOp,.  co
8ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20  nst char *zP4,. 
8ef0: 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20   int n.){.  if( 
8f00: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
8f10: 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c     freeP4(p->db,
8f20: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
8f30: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f  p->p4.p);.    pO
8f40: 70 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20  p->p4type = 0;. 
8f50: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30     pOp->p4.p = 0
8f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20  ;.  }.  if( n<0 
8f70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
8f80: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69  beChangeP4(p, (i
8f90: 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70  nt)(pOp - p->aOp
8fa0: 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65  ), zP4, n);.  }e
8fb0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
8fc0: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
8fd0: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
8fe0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
8ff0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
9000: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
9010: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
9020: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
9030: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
9040: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
9050: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
9060: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
9070: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
9080: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
9090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
90a0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
90b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
90c0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
90d0: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
90e0: 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20  t( p->aOp!=0 || 
90f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9100: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
9110: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9120: 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42    if( n!=P4_VTAB
9130: 20 29 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c   ) freeP4(db, n,
9140: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
9150: 29 26 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75  )&zP4);.    retu
9160: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
9170: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
9180: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
9190: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
91a0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
91b0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
91c0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
91d0: 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e  p[addr];.  if( n
91e0: 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79  >=0 || pOp->p4ty
91f0: 70 65 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68  pe ){.    vdbeCh
9200: 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f  angeP4Full(p, pO
9210: 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  p, zP4, n);.    
9220: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
9230: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
9240: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
9250: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
9260: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
9270: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
9280: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
9290: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
92a0: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
92b0: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
92c0: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
92d0: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
92e0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
92f0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
9300: 73 65 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b  se if( zP4!=0 ){
9310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30  .    assert( n<0
9320: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
9330: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
9340: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
9350: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e  = (signed char)n
9360: 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f  ;.    if( n==P4_
9370: 56 54 41 42 20 29 20 73 71 6c 69 74 65 33 56 74  VTAB ) sqlite3Vt
9380: 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29  abLock((VTable*)
9390: 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  zP4);.  }.}../*.
93a0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 34  ** Change the P4
93b0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
93c0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
93d0: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ded instruction 
93e0: 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65  .** to the value
93f0: 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20   defined by the 
9400: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73  arguments.  This
9410: 20 69 73 20 61 20 68 69 67 68 2d 73 70 65 65 64   is a high-speed
9420: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  .** version of s
9430: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9440: 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  P4()..**.** The 
9450: 50 34 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20  P4 operand must 
9460: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 70 72  not have been pr
9470: 65 76 69 6f 75 73 6c 79 20 64 65 66 69 6e 65 64  eviously defined
9480: 2e 20 20 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a  .  And the new.*
9490: 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74 20 62 65  * P4 must not be
94a0: 20 50 34 5f 49 4e 54 33 32 2e 20 20 55 73 65 20   P4_INT32.  Use 
94b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
94c0: 65 50 34 28 29 20 69 6e 20 65 69 74 68 65 72 20  eP4() in either 
94d0: 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61 73 65  of.** those case
94e0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
94f0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 56  e3VdbeAppendP4(V
9500: 64 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50  dbe *p, void *pP
9510: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62  4, int n){.  Vdb
9520: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65  eOp *pOp;.  asse
9530: 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20  rt( n!=P4_INT32 
9540: 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b  && n!=P4_VTAB );
9550: 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 30 20  .  assert( n<=0 
9560: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
9570: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9580: 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62      freeP4(p->db
9590: 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c  , n, pP4);.  }el
95a0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
95b0: 70 50 34 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  pP4!=0 );.    as
95c0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
95d0: 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e  ;.    pOp = &p->
95e0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20  aOp[p->nOp-1];. 
95f0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
9600: 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53  p4type==P4_NOTUS
9610: 45 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  ED );.    pOp->p
9620: 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70  4type = n;.    p
9630: 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a  Op->p4.p = pP4;.
9640: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
9650: 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d   the P4 on the m
9660: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9670: 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  ed opcode to the
9680: 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65   KeyInfo for the
9690: 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e  .** index given.
96a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
96b0: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
96c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
96d0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
96e0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
96f0: 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e  ->pVdbe;.  KeyIn
9700: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
9710: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
9720: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
9730: 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20  0 );.  pKeyInfo 
9740: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
9750: 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
9760: 70 49 64 78 29 3b 0a 20 20 69 66 28 20 70 4b 65  pIdx);.  if( pKe
9770: 79 49 6e 66 6f 20 29 20 73 71 6c 69 74 65 33 56  yInfo ) sqlite3V
9780: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
9790: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
97a0: 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  NFO);.}..#ifdef 
97b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
97c0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f  PLAIN_COMMENTS./
97d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
97e0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
97f0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
9800: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
9810: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
9820: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
9830: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
9840: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
9850: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
9860: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
9870: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
9880: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
9890: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
98a0: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
98b0: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
98c0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
98d0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
98e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
98f0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
9900: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
9910: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
9920: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9930: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
9940: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
9950: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
9960: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9970: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
9980: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9990: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
99a0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
99b0: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
99c0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
99d0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
99e0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
99f0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
9a00: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
9a10: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
9a20: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
9a30: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
9a40: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
9a50: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
9a60: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
9a70: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
9a80: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
9a90: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
9aa0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
9ab0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
9ac0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
9ad0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
9ae0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
9af0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
9b00: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
9b10: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
9b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
9b30: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
9b40: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
9b50: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
9b60: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
9b70: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
9b80: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
9b90: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
9ba0: 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  UG */..#ifdef SQ
9bb0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
9bc0: 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  GE./*.** Set the
9bd0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53   value if the iS
9be0: 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72  rcLine field for
9bf0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
9c00: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
9c10: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9c20: 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d  e3VdbeSetLineNum
9c30: 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ber(Vdbe *v, int
9c40: 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74   iLine){.  sqlit
9c50: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31  e3VdbeGetOp(v,-1
9c60: 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  )->iSrcLine = iL
9c70: 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ine;.}.#endif /*
9c80: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
9c90: 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ERAGE */../*.** 
9ca0: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64  Return the opcod
9cb0: 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64  e for a given ad
9cc0: 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61  dress.  If the a
9cd0: 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68  ddress is -1, th
9ce0: 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  en.** return the
9cf0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
9d00: 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a  nserted opcode..
9d10: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
9d20: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
9d30: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  or has occurred 
9d40: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  prior to the cal
9d50: 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ling of this.** 
9d60: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20  routine, then a 
9d70: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d  pointer to a dum
9d80: 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62  my VdbeOp will b
9d90: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61  e returned.  Tha
9da0: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72  t opcode.** is r
9db0: 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20  eadable but not 
9dc0: 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68  writable, though
9dd0: 20 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61   it is cast to a
9de0: 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e   writable value.
9df0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f  .** The return o
9e00: 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65  f a dummy opcode
9e10: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c   allows the call
9e20: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e   to continue fun
9e30: 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65  ctioning.** afte
9e40: 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77  r an OOM fault w
9e50: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
9e60: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
9e70: 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
9e80: 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
9e90: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69  e is a valid poi
9ea0: 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75  nter.  But becau
9eb0: 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63  se the dummy.opc
9ec0: 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d  ode is 0,.** dum
9ed0: 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  my will never be
9ee0: 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68   written to.  Th
9ef0: 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62  is is verified b
9f00: 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f  y code inspectio
9f10: 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e  n and.** by runn
9f20: 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e  ing with Valgrin
9f30: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  d..*/.VdbeOp *sq
9f40: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
9f50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
9f60: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
9f70: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
9f80: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
9f90: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
9fa0: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
9fb0: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
9fc0: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
9fd0: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
9fe0: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
9ff0: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
a000: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
a010: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
a020: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
a030: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
a040: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
a050: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
a060: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
a070: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
a080: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
a090: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
a0a0: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
a0b0: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
a0c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
a0d0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
a0e0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a0f0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
a100: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
a110: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
a120: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
a130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
a140: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
a150: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a  AIN_COMMENTS)./*
a160: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  .** Return an in
a170: 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
a180: 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d  one of the param
a190: 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63  eters to the opc
a1a0: 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72  ode pOp.** deter
a1b0: 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74  mined by charact
a1c0: 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er c..*/.static 
a1d0: 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63  int translateP(c
a1e0: 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20  har c, const Op 
a1f0: 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d  *pOp){.  if( c==
a200: 27 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '1' ) return pOp
a210: 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p1;.  if( c=='
a220: 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  2' ) return pOp-
a230: 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33  >p2;.  if( c=='3
a240: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
a250: 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27  p3;.  if( c=='4'
a260: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
a270: 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  4.i;.  return pO
a280: 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->p5;.}../*.** 
a290: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
a2a0: 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e   for the "commen
a2b0: 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44  t" field of a VD
a2c0: 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e  BE opcode listin
a2d0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e  g..**.** The Syn
a2e0: 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20  opsis: field in 
a2f0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
a300: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69  vdbe.c source fi
a310: 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65  le gets converte
a320: 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61  d.** to an extra
a330: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
a340: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
a350: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
a360: 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20  e().  In the.** 
a370: 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72  absence of other
a380: 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20   comments, this 
a390: 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73  synopsis becomes
a3a0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
a3b0: 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53  the opcode..** S
a3c0: 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ome translation 
a3d0: 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  occurs:.**.**   
a3e0: 20 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e      "PX"      ->
a3f0: 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20    "r[X]".**     
a400: 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20    "PX@PY"   ->  
a410: 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f  "r[X..X+Y-1]"  o
a420: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73  r "r[x]" if y is
a430: 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20   0 or 1.**      
a440: 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22   "PX@PY+1" ->  "
a450: 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72  r[X..X+Y]"    or
a460: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
a470: 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e  0.**       "PY..
a480: 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59  PY"  ->  "r[X..Y
a490: 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d  ]"      or "r[x]
a4a0: 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61  " if y<=x.*/.sta
a4b0: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43  tic int displayC
a4c0: 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20  omment(.  const 
a4d0: 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20  Op *pOp,     /* 
a4e0: 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65  The opcode to be
a4f0: 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   commented */.  
a500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
a510: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79     /* Previously
a520: 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20   obtained value 
a530: 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72  for P4 */.  char
a540: 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f   *zTemp,       /
a550: 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68  * Write result h
a560: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ere */.  int nTe
a570: 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  mp          /* S
a580: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69  pace available i
a590: 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a  n zTemp[] */.){.
a5a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
a5b0: 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pName;.  const c
a5c0: 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a  har *zSynopsis;.
a5d0: 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20    int nOpName;. 
a5e0: 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63   int ii, jj;.  c
a5f0: 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20  har zAlt[50];.  
a600: 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  zOpName = sqlite
a610: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
a620: 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e  >opcode);.  nOpN
a630: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
a640: 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a  len30(zOpName);.
a650: 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f    if( zOpName[nO
a660: 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20  pName+1] ){.    
a670: 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b  int seenCom = 0;
a680: 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20  .    char c;.   
a690: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70   zSynopsis = zOp
a6a0: 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20  Name += nOpName 
a6b0: 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72  + 1;.    if( str
a6c0: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22  ncmp(zSynopsis,"
a6d0: 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  IF ",3)==0 ){.  
a6e0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20      if( pOp->p5 
a6f0: 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  & SQLITE_STOREP2
a700: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a710: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
a720: 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c  eof(zAlt), zAlt,
a730: 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c   "r[P2] = (%s)",
a740: 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20   zSynopsis+3);. 
a750: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a760: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a770: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74  intf(sizeof(zAlt
a780: 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20  ), zAlt, "if %s 
a790: 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70  goto P2", zSynop
a7a0: 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a  sis+3);.      }.
a7b0: 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20        zSynopsis 
a7c0: 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20  = zAlt;.    }.  
a7d0: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
a7e0: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
a7f0: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
a800: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
a810: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
a820: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
a830: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
a840: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
a850: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a860: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
a870: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
a880: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
a890: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a8a0: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
a8b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a8c0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
a8d0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
a8e0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
a8f0: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
a900: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
a910: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
a920: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
a930: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
a940: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
a950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a960: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
a970: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
a980: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
a990: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
a9a0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
a9b0: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
a9c0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
a9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
a9e0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
a9f0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
aa00: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
aa10: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
aa20: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
aa40: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
aa50: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
aa60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
aa70: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
aa80: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
aaa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
aab0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
aac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
aad0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
aae0: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
aaf0: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
ab00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ab10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
ab20: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
ab30: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
ab40: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
ab50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ab60: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
ab70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
ab80: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
ab90: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
aba0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
abb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
abc0: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
abd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
abe0: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
abf0: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
ac00: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
ac10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
ac20: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
ac30: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
ac40: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
ac50: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
ac60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
ac70: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
ac80: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
ac90: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
aca0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
acb0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
acc0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
acd0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
ace0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
acf0: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
ad00: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ad10: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
ad20: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
ad30: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
ad40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
ad50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ad60: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
ad70: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
ad80: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
ad90: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
ada0: 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72  _HINTS)./*.** Tr
adb0: 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70  anslate the P4.p
adc0: 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61  Expr value for a
add0: 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20  n OP_CursorHint 
ade0: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74  opcode into text
adf0: 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
ae00: 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65  displayed in the
ae10: 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58   P4 column of EX
ae20: 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f  PLAIN output..*/
ae30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
ae40: 70 6c 61 79 50 34 45 78 70 72 28 53 74 72 41 63  playP4Expr(StrAc
ae50: 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45  cum *p, Expr *pE
ae60: 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  xpr){.  const ch
ae70: 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73  ar *zOp = 0;.  s
ae80: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
ae90: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
aea0: 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71  STRING:.      sq
aeb0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
aec0: 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78 70 72  f(p, "%Q", pExpr
aed0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
aee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
aef0: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
af00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
af10: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25 64 22  _appendf(p, "%d"
af20: 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  , pExpr->u.iValu
af30: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
af40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
af50: 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  L:.      sqlite3
af60: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
af70: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
af80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
af90: 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
afa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
afb0: 61 70 70 65 6e 64 66 28 70 2c 20 22 72 5b 25 64  appendf(p, "r[%d
afc0: 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ]", pExpr->iTabl
afd0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
afe0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
aff0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
b000: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
b010: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
b020: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b030: 70 70 65 6e 64 66 28 70 2c 20 22 72 6f 77 69 64  ppendf(p, "rowid
b040: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
b050: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b060: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
b070: 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78 70  "c%d", (int)pExp
b080: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
b090: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
b0a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b0b0: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70   TK_LT:      zOp
b0c0: 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62 72   = "LT";      br
b0d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
b0e0: 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LE:      zOp = 
b0f0: 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LE";      break
b100: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
b110: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 54  :      zOp = "GT
b120: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b130: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20     case TK_GE:  
b140: 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20      zOp = "GE"; 
b150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b160: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
b170: 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20   zOp = "NE";    
b180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b190: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f  e TK_EQ:      zO
b1a0: 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20 62  p = "EQ";      b
b1b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b1c0: 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_IS:      zOp =
b1d0: 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65 61   "IS";      brea
b1e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
b1f0: 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49  SNOT:   zOp = "I
b200: 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SNOT";   break;.
b210: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
b220: 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22       zOp = "AND"
b230: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b240: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
b250: 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20    zOp = "OR";   
b260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b270: 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a  se TK_PLUS:    z
b280: 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 20  Op = "ADD";     
b290: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
b2a0: 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70 20  TK_STAR:    zOp 
b2b0: 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72 65  = "MUL";     bre
b2c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
b2d0: 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  MINUS:   zOp = "
b2e0: 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  SUB";     break;
b2f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
b300: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d  :     zOp = "REM
b310: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b320: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
b330: 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44  :  zOp = "BITAND
b340: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
b350: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
b360: 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20  zOp = "BITOR";  
b370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b380: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70   TK_SLASH:   zOp
b390: 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62 72   = "DIV";     br
b3a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
b3b0: 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _LSHIFT:  zOp = 
b3c0: 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "LSHIFT";  break
b3d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
b3e0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53  HIFT:  zOp = "RS
b3f0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
b400: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
b410: 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41  T:  zOp = "CONCA
b420: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
b430: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
b440: 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20   zOp = "MINUS"; 
b450: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b460: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f  e TK_UPLUS:   zO
b470: 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20 62  p = "PLUS";    b
b480: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b490: 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d  K_BITNOT:  zOp =
b4a0: 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65 61   "BITNOT";  brea
b4b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
b4c0: 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e  OT:     zOp = "N
b4d0: 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OT";     break;.
b4e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
b4f0: 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55  LL:  zOp = "ISNU
b500: 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  LL";  break;.   
b510: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
b520: 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c  : zOp = "NOTNULL
b530: 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64  "; break;..    d
b540: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71  efault:.      sq
b550: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b560: 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72  f(p, "%s", "expr
b570: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
b580: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20  .  }..  if( zOp 
b590: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
b5a0: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
b5b0: 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64  s(", zOp);.    d
b5c0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20  isplayP4Expr(p, 
b5d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
b5e0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
b5f0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
b600: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b610: 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20  (p, ",", 1);.   
b620: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
b630: 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  (p, pExpr->pRigh
b640: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
b650: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b660: 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d  (p, ")", 1);.  }
b670: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42  .}.#endif /* VDB
b680: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20  E_DISPLAY_P4 && 
b690: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
b6a0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
b6b0: 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42  TS) */...#if VDB
b6c0: 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a  E_DISPLAY_P4./*.
b6d0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
b6e0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
b6f0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
b700: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
b710: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
b720: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
b730: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
b740: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
b750: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
b760: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
b770: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
b780: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
b790: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41   = zTemp;.  StrA
b7a0: 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65 72 74  ccum x;.  assert
b7b0: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
b7c0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
b7d0: 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d  Init(&x, 0, zTem
b7e0: 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20  p, nTemp, 0);.  
b7f0: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
b800: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
b810: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
b820: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
b830: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
b840: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
b850: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  yInfo;.      ass
b860: 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
b870: 53 6f 72 74 46 6c 61 67 73 21 3d 30 20 29 3b 0a  SortFlags!=0 );.
b880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b890: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 6b  r_appendf(&x, "k
b8a0: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
b8b0: 6e 4b 65 79 46 69 65 6c 64 29 3b 0a 20 20 20 20  nKeyField);.    
b8c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
b8d0: 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
b8e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b8f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
b900: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
b910: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  [j];.        con
b920: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
b930: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
b940: 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20  zName : "";.    
b950: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
b960: 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d  Coll, "BINARY")=
b970: 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22  =0 ) zColl = "B"
b980: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b990: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b9a0: 2c 20 22 2c 25 73 25 73 25 73 22 2c 20 0a 20 20  , ",%s%s%s", .  
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 4b               (pK
b9c0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61  eyInfo->aSortFla
b9d0: 67 73 5b 6a 5d 20 26 20 4b 45 59 49 4e 46 4f 5f  gs[j] & KEYINFO_
b9e0: 4f 52 44 45 52 5f 44 45 53 43 29 20 3f 20 22 2d  ORDER_DESC) ? "-
b9f0: 22 20 3a 20 22 22 2c 20 0a 20 20 20 20 20 20 20  " : "", .       
ba00: 20 20 20 20 20 20 20 20 28 70 4b 65 79 49 6e 66          (pKeyInf
ba10: 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b 6a 5d  o->aSortFlags[j]
ba20: 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52   & KEYINFO_ORDER
ba30: 5f 42 49 47 4e 55 4c 4c 29 3f 20 22 4e 2e 22 20  _BIGNULL)? "N." 
ba40: 3a 20 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20  : "", .         
ba50: 20 20 20 20 20 20 7a 43 6f 6c 6c 29 3b 0a 20 20        zColl);.  
ba60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ba70: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26  te3_str_append(&
ba80: 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20  x, ")", 1);.    
ba90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
baa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bab0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
bac0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50  .    case P4_EXP
bad0: 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c  R: {.      displ
bae0: 61 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70  ayP4Expr(&x, pOp
baf0: 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20  ->p4.pExpr);.   
bb00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bb10: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
bb20: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
bb30: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
bb40: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
bb50: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
bb60: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
bb70: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
bb80: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
bb90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bba0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
bbb0: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
bbc0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
bbd0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
bbe0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
bbf0: 65 6e 64 66 28 26 78 2c 20 22 25 73 28 25 64 29  endf(&x, "%s(%d)
bc00: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
bc10: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
bc20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bc30: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
bc40: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  CTX: {.      Fun
bc50: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
bc60: 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63  ->p4.pCtx->pFunc
bc70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
bc80: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
bc90: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
bca0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
bcb0: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
bcc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
bcd0: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
bce0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
bcf0: 70 65 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22  pendf(&x, "%lld"
bd00: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
bd10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bd20: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
bd30: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
bd40: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
bd50: 6e 64 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f  ndf(&x, "%d", pO
bd60: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
bd70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
bd80: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
bd90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
bda0: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
bdb0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
bdc0: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
bdd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
bde0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
bdf0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
be00: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
be10: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
be20: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
be30: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
be40: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
be50: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
be60: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  lags & (MEM_Int|
be70: 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a  MEM_IntReal) ){.
be80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
be90: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
bea0: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
beb0: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
bec0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
bed0: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
bee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
bef0: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
bf00: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
bf10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
bf20: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
bf30: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
bf40: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
bf50: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
bf60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bf70: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
bf80: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
bf90: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
bfa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bfb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
bfc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bfd0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
bfe0: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
bff0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
c000: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
c010: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
c020: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
c030: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
c040: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
c050: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
c060: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c070: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
c080: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
c090: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
c0a0: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
c0b0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
c0c0: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
c0d0: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
c0e0: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
c0f0: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
c120: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
c130: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
c140: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
c150: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <=n; i++){.     
c160: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
c170: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22  ppendf(&x, ",%d"
c180: 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ai[i]);.      
c190: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  }.      zTemp[0]
c1a0: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71   = '[';.      sq
c1b0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
c1c0: 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20  (&x, "]", 1);.  
c1d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c1e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
c1f0: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
c200: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
c210: 65 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61  endf(&x, "progra
c220: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
c230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c240: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
c250: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
c260: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
c270: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
c280: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c290: 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a  ase P4_TABLE: {.
c2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
c2b0: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
c2c0: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  s", pOp->p4.pTab
c2d0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
c2e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c2f0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
c300: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
c310: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
c320: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
c330: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
c340: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
c350: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c360: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
c370: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
c380: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
c390: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
c3a0: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
c3b0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
c3c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
c3d0: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
c3e0: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
c3f0: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
c400: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
c410: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
c420: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
c430: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
c440: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
c450: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
c460: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
c470: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
c480: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
c490: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
c4a0: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
c4b0: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
c4c0: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
c4d0: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
c4e0: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
c4f0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
c500: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
c510: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
c520: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
c530: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
c540: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
c550: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
c560: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
c570: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
c580: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
c590: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
c5a0: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
c5b0: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
c5c0: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
c5d0: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
c5e0: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
c5f0: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
c600: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
c610: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
c620: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
c630: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c640: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
c650: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  E)./*.** If SQLi
c660: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
c670: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
c680: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
c690: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
c6a0: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
c6b0: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
c6c0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
c6d0: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
c6e0: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
c6f0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
c700: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
c710: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
c720: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
c730: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
c740: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
c750: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
c760: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
c770: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
c780: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
c790: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
c7a0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
c7b0: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
c7c0: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
c7d0: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
c7e0: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
c7f0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
c800: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
c810: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
c820: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
c830: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
c840: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
c850: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
c860: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
c870: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
c880: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
c890: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
c8a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
c8b0: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
c8c0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
c8d0: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
c8e0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
c8f0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
c900: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
c910: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
c920: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
c930: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
c940: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
c950: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
c960: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
c970: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
c980: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
c990: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
c9a0: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
c9b0: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
c9c0: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
c9d0: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
c9e0: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
c9f0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
ca00: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
ca10: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
ca20: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
ca30: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
ca40: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
ca50: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
ca60: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
ca70: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
ca80: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
ca90: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
caa0: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
cab0: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
cac0: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
cad0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
cae0: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
caf0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
cb00: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
cb10: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
cb20: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
cb30: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
cb40: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
cb50: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
cb60: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
cb70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cb80: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
cb90: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
cba0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
cbb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cbc0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
cbd0: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
cbe0: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
cbf0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
cc00: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
cc10: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
cc20: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
cc30: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
cc40: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
cc50: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
cc60: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
cc70: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
cc80: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
cc90: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
cca0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
ccb0: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
ccc0: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
ccd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
cce0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
ccf0: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
cd00: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
cd10: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
cd20: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
cd30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
cd40: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
cd50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
cd60: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
cd70: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
cd80: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
cd90: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
cda0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
cdb0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
cdc0: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
cdd0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
cde0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
cdf0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
ce00: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
ce10: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
ce20: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
ce30: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
ce40: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
ce50: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
ce60: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
ce70: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
ce80: 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a  , VdbeOp *pOp){.
ce90: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
cea0: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
ceb0: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
cec0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
ced0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
cee0: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
cef0: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
cf00: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
cf10: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
cf20: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
cf30: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
cf40: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
cf50: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
cf60: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
cf70: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
cf80: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
cf90: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
cfa0: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
cfb0: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
cfc0: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
cfd0: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
cfe0: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
cff0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
d000: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
d010: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
d020: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
d030: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
d040: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
d050: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
d060: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
d070: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
d080: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
d090: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
d0a0: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
d0b0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
d0c0: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
d0d0: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
d0e0: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
d0f0: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
d100: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
d110: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
d120: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
d130: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
d140: 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   element..*/.sta
d150: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d  tic void initMem
d160: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
d170: 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  t N, sqlite3 *db
d180: 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20  , u16 flags){.  
d190: 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29  while( (N--)>0 )
d1a0: 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  {.    p->db = db
d1b0: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
d1c0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73   flags;.    p->s
d1d0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66  zMalloc = 0;.#if
d1e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
d1f0: 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72  .    p->pScopyFr
d200: 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  om = 0;.#endif. 
d210: 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f     p++;.  }.}../
d220: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
d230: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
d240: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
d250: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
d260: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
d270: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
d280: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
d290: 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20  pEnd = &p[N];.  
d2a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d2b0: 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64  p->db;.    if( d
d2c0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
d2d0: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
d2e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
d2f0: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
d300: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
d310: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  loc);.      }whi
d320: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
d330: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
d340: 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
d350: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
d360: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
d370: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
d380: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
d390: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
d3a0: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
d3b0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
d3c0: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
d3d0: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
d3e0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
d3f0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
d400: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
d410: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
d420: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
d430: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
d440: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
d450: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
d460: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
d470: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
d480: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
d490: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
d4a0: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
d4b0: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
d4c0: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
d4d0: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
d4e0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
d4f0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
d500: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
d510: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
d520: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
d530: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
d540: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
d550: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
d560: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
d570: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
d580: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
d590: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
d5a0: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
d5b0: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
d5c0: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
d5d0: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
d5e0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
d5f0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
d600: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
d610: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
d620: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
d630: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
d640: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
d650: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
d660: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
d670: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
d680: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
d690: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
d6a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
d6b0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
d6c0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
d6d0: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
d6e0: 73 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d  stcase( p->xDel=
d6f0: 3d 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d  =sqlite3VdbeFram
d700: 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20  eMemDel );.     
d710: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
d720: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20  EM_Agg|MEM_Dyn) 
d730: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d740: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
d750: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
d760: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
d770: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d780: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
d790: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
d7a0: 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63       p->szMalloc
d7b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
d7c0: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
d7d0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
d7e0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
d7f0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  <pEnd );.  }.}..
d800: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d810: 42 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  BUG./*.** Verify
d820: 20 74 68 61 74 20 70 46 72 61 6d 65 20 69 73 20   that pFrame is 
d830: 61 20 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d  a valid VdbeFram
d840: 65 20 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75  e pointer.  Retu
d850: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
d860: 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66  .** and false if
d870: 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72   something is wr
d880: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ong..**.** This 
d890: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e  routine is inten
d8a0: 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69  ded for use insi
d8b0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
d8c0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a  tatements only..
d8d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
d8e0: 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56  beFrameIsValid(V
d8f0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
d900: 29 7b 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d  ){.  if( pFrame-
d910: 3e 69 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51  >iFrameMagic!=SQ
d920: 4c 49 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43  LITE_FRAME_MAGIC
d930: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
d940: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
d950: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  f.../*.** This i
d960: 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f  s a destructor o
d970: 6e 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28  n a Mem object (
d980: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
d990: 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
d9a0: 29 0a 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65  ).** that delete
d9b0: 73 20 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65  s the Frame obje
d9c0: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
d9d0: 68 65 64 20 74 6f 20 69 74 20 61 73 20 61 20 62  hed to it as a b
d9e0: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lob..**.** This 
d9f0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
da00: 20 64 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d   delete the Fram
da10: 65 20 72 69 67 68 74 20 61 77 61 79 2e 20 20 49  e right away.  I
da20: 74 20 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68  t merely adds th
da30: 65 0a 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20  e.** frame to a 
da40: 6c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  list of frames t
da50: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  o be deleted whe
da60: 6e 20 74 68 65 20 56 64 62 65 20 68 61 6c 74 73  n the Vdbe halts
da70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
da80: 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c  3VdbeFrameMemDel
da90: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
daa0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
dab0: 65 20 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29  e = (VdbeFrame*)
dac0: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
dad0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
dae0: 49 73 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20  IsValid(pFrame) 
daf0: 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61  );.  pFrame->pPa
db00: 72 65 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76  rent = pFrame->v
db10: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70  ->pDelFrame;.  p
db20: 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72  Frame->v->pDelFr
db30: 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a  ame = pFrame;.}.
db40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
db50: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
db60: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
db70: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
db80: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
db90: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
dba0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
dbb0: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
dbc0: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
dbd0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
dbe0: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
dbf0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
dc00: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
dc10: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
dc20: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
dc30: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
dc40: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
dc50: 64 4d 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28  dMem];.  assert(
dc60: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
dc70: 65 49 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20  eIsValid(p) );. 
dc80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
dc90: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
dca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
dcb0: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
dcc0: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
dcd0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
dce0: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
dcf0: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Mem);.  sqlite3V
dd00: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
dd10: 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70  (p->v->db, &p->p
dd20: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
dd30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
dd40: 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d  (p->v->db, p);.}
dd50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
dd60: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
dd70: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
dd80: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
dd90: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
dda0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
ddb0: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
ddc0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
ddd0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
dde0: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
ddf0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
de00: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
de10: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
de20: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
de30: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
de40: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
de50: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
de60: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
de70: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
de80: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
de90: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
dea0: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
deb0: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
dec0: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
ded0: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
dee0: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
def0: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
df00: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
df10: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
df20: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
df30: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
df40: 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30   PLAN..** 2018-0
df50: 34 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70  4-24:  In p->exp
df60: 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68  lain==2 mode, th
df70: 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65  e OP_Init opcode
df80: 73 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a  s of triggers.**
df90: 20 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c   are also shown,
dfa0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75   so that the bou
dfb0: 6e 64 61 72 69 65 73 20 62 65 74 77 65 65 6e 20  ndaries between 
dfc0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
dfd0: 20 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69   and.** each tri
dfe0: 67 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a  gger are clear..
dff0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
e000: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
e010: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
e020: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
e030: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
e040: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
e050: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
e060: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
e070: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
e080: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e0a0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
e0b0: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
e0e0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
e0f0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
e100: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e130: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
e140: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
e150: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
e160: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e170: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
e180: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
e190: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
e1c0: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
e1d0: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
e1e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
e1f0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
e200: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
e210: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
e220: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e250: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
e260: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e290: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
e2a0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
e2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e2c0: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
e2d0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62  t set */.  int b
e2e0: 4c 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28  ListSubprogs = (
e2f0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c  p->explain==1 ||
e300: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
e310: 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51 50 29  LITE_TriggerEQP)
e320: 21 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20  !=0);.  Op *pOp 
e330: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
e340: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
e350: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
e360: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
e370: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
e380: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
e390: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
e3a0: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
e3b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
e3c0: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
e3d0: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
e3e0: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
e3f0: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
e400: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
e410: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
e420: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
e430: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
e440: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
e450: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
e460: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
e470: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
e480: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
e490: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
e4a0: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
e4b0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
e4c0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
e4d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
e4e0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
e4f0: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
e500: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
e510: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
e520: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
e530: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
e540: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
e550: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
e560: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
e570: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e580: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
e590: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
e5a0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
e5b0: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
e5c0: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
e5d0: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
e5e0: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
e5f0: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
e600: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
e610: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
e620: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
e630: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
e640: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
e650: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
e660: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
e670: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
e680: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
e690: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
e6a0: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
e6b0: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
e6c0: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
e6d0: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
e6e0: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
e6f0: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
e700: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
e710: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
e720: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
e730: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
e740: 70 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75  p;.  if( bListSu
e750: 62 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a  bprogs ){.    /*
e760: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
e770: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
e780: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
e790: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
e7a0: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
e7b0: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
e7c0: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
e7d0: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
e7e0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
e7f0: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
e800: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
e810: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
e820: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
e830: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
e840: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
e850: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
e860: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
e870: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
e880: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
e890: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
e8a0: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
e8b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
e8c0: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
e8d0: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
e8e0: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
e8f0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
e900: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
e910: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
e920: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
e930: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
e940: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
e950: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
e960: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
e970: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
e980: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
e990: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
e9a0: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
e9b0: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
e9c0: 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31  }.  }..  while(1
e9d0: 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74  ){  /* Loop exit
e9e0: 73 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20  s via break */. 
e9f0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
ea00: 20 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20      if( i>=nRow 
ea10: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
ea20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
ea30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
ea40: 4e 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  NE;.      break;
ea50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
ea60: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
ea70: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
ea80: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
ea90: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
eaa0: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
eab0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
eac0: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
ead0: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
eae0: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
eaf0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
eb00: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
eb10: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
eb20: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
eb30: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
eb40: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
eb50: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
eb60: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
eb70: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
eb80: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  >nOp;.      asse
eb90: 72 74 28 20 61 70 53 75 62 21 3d 30 20 29 3b 0a  rt( apSub!=0 );.
eba0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
ebb0: 75 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  ub>0 );.      fo
ebc0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
ebd0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
ebe0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
ebf0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
ec00: 20 20 20 61 73 73 65 72 74 28 20 69 3c 61 70 53     assert( i<apS
ec10: 75 62 5b 6a 5d 2d 3e 6e 4f 70 20 7c 7c 20 6a 2b  ub[j]->nOp || j+
ec20: 31 3c 6e 53 75 62 20 29 3b 0a 20 20 20 20 20 20  1<nSub );.      
ec30: 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61  }.      pOp = &a
ec40: 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b  pSub[j]->aOp[i];
ec50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57  .    }..    /* W
ec60: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
ec70: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
ec80: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
ec90: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
eca0: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
ecb0: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
ecc0: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
ecd0: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
ece0: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
ecf0: 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e    ** kept in p->
ed00: 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c  aMem[9].z to hol
ed10: 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61  d the new progra
ed20: 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69  m - assuming thi
ed30: 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20  s subprogram.   
ed40: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
ed50: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
ed60: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c     */.    if( bL
ed70: 69 73 74 53 75 62 70 72 6f 67 73 20 26 26 20 70  istSubprogs && p
ed80: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
ed90: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
eda0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
edb0: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
edc0: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
edd0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
ede0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
edf0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
ee00: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70  f( apSub[j]==pOp
ee10: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
ee20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
ee30: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
ee40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
ee50: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
ee60: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
ee70: 74 65 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20  te, nSub!=0);.  
ee80: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21        if( p->rc!
ee90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
eea0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
eeb0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
eec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70      }.        ap
eee0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
eef0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
ef00: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
ef10: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
ef20: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
ef30: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
ef40: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
ef50: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
ef60: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
ef70: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f  m*);.        nRo
ef80: 77 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  w += pOp->p4.pPr
ef90: 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ogram->nOp;.    
efa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
efb0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29  ( p->explain<2 )
efc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
efd0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
efe0: 45 78 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b  Explain ) break;
eff0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
f000: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
f010: 20 70 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b   p->pc>1 ) break
f020: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
f030: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f040: 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49    if( db->u1.isI
f050: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
f060: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
f070: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
f080: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f090: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
f0a0: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
f0b0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
f0c0: 2d 3e 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ->rc));.    }els
f0d0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
f0e0: 50 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  P4;.      if( p-
f0f0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
f100: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
f110: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
f120: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f130: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
f160: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
f170: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20    pMem++;.    . 
f180: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
f190: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
f1a0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
f1b0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
f1c0: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
f1d0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
f1e0: 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70  ->opcode); /* Op
f1f0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
f200: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
f210: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  =0 );.        pM
f220: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
f230: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
f240: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
f250: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
f260: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b  8;.        pMem+
f270: 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  +;.      }..    
f280: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f290: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
f2a0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
f2b0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2d0: 50 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P1 */.      pMem
f2e0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ++;..      pMem-
f2f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
f300: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
f310: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
f340: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
f350: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f360: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
f370: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
f380: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3a0: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P3 */.      pM
f3b0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28  em++;..      if(
f3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
f3d0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
f3e0: 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50  em, 100) ){ /* P
f3f0: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  4 */.        ass
f400: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
f410: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
f420: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f430: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
f440: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
f450: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
f460: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34  _Term;.      zP4
f470: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
f480: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d  , pMem->z, pMem-
f490: 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  >szMalloc);.    
f4a0: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
f4b0: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  >z ){.        pM
f4c0: 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
f4d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
f4e0: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50  mSetStr(pMem, zP
f4f0: 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  4, -1, SQLITE_UT
f500: 46 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  F8, 0);.      }e
f510: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
f520: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
f530: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
f540: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
f550: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
f560: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
f570: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
f580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
f590: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28  em++;..      if(
f5a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
f5b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
f5c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
f5d0: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
f5e0: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   4) ){.         
f5f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
f600: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
f610: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f620: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
f630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f640: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f650: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
f660: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
f670: 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71   = 2;.        sq
f680: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
f690: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78  , pMem->z, "%.2x
f6a0: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
f6b0: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P5 */.        
f6c0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
f6d0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
f6e0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69   pMem++;.    .#i
f6f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f700: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
f710: 4e 54 53 0a 20 20 20 20 20 20 20 20 69 66 28 20  NTS.        if( 
f720: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
f730: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
f740: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
f750: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f760: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f770: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
f780: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
f790: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
f7a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f7b0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
f7c0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
f7d0: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
f7e0: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
f7f0: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
f800: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
f810: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
f820: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d  #else.        pM
f830: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
f840: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
f850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f860: 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  omment */.#endif
f870: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f880: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
f890: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
f8a0: 6e 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  n-1);.      p->p
f8b0: 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e  ResultSet = &p->
f8c0: 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70  aMem[1];.      p
f8d0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
f8e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
f8f0: 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20  ITE_ROW;.    }. 
f900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
f910: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f920: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
f930: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
f940: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
f950: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
f960: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
f970: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
f980: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
f990: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
f9a0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f  l(Vdbe *p){.  co
f9b0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
f9c0: 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29  .  if( p->zSql )
f9d0: 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71  {.    z = p->zSq
f9e0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
f9f0: 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20  ->nOp>=1 ){.    
fa00: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f  const VdbeOp *pO
fa10: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
fa20: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
fa30: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
fa40: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
fa50: 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70        z = pOp->p
fa60: 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  4.z;.      while
fa70: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
fa80: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
fa90: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20  }.  }.  if( z ) 
faa0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
fab0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64  ]\n", z);.}.#end
fac0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
fad0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
fae0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
faf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
fb00: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
fb10: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
fb20: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
fb30: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
fb40: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
fb50: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
fb60: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
fb70: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
fb80: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
fb90: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
fba0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
fbb0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
fbc0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
fbd0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
fbe0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
fbf0: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
fc00: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
fc10: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
fc20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
fc30: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
fc40: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
fc50: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
fc60: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
fc70: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
fc80: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
fc90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
fca0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
fcb0: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
fcc0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
fcd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
fce0: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
fcf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
fd00: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
fd10: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
fd20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
fd30: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
fd40: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
fd50: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
fd60: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
fd70: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
fd80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
fd90: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69  RACE */../* An i
fda0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
fdb0: 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73  object describes
fdc0: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61   bulk memory ava
fdd0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a  ilable for use.*
fde0: 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e  * by subcomponen
fdf0: 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64  ts of a prepared
fe00: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61   statement.  Spa
fe10: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ce is allocated 
fe20: 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73  out.** of a Reus
fe30: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
fe40: 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61   by the allocSpa
fe50: 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c  ce() routine bel
fe60: 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65  ow..*/.struct Re
fe70: 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20  usableSpace {.  
fe80: 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  u8 *pSpace;     
fe90: 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61         /* Availa
fea0: 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ble memory */.  
feb0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 46  sqlite3_int64 nF
fec0: 72 65 65 3b 20 20 20 2f 2a 20 42 79 74 65 73 20  ree;   /* Bytes 
fed0: 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d  of available mem
fee0: 6f 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ory */.  sqlite3
fef0: 5f 69 6e 74 36 34 20 6e 4e 65 65 64 65 64 3b 20  _int64 nNeeded; 
ff00: 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74  /* Total bytes t
ff10: 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  hat could not be
ff20: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b   allocated */.};
ff30: 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f  ../* Try to allo
ff40: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
ff50: 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
ff60: 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66  ed bulk memory f
ff70: 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20  or pBuf.** from 
ff80: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
ff90: 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72  e object.  Retur
ffa0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
ffb0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  he allocated.** 
ffc0: 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73  memory on succes
ffd0: 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  s.  If insuffici
ffe0: 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ent memory is av
fff0: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a  ailable in the.*
10000 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  * ReusableSpace 
10010 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65  object, increase
10020 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61   the ReusableSpa
10030 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61  ce.nNeeded.** va
10040 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  lue by the amoun
10050 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74  t needed and ret
10060 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
10070 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69  If pBuf is not i
10080 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
10090 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
100a0 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c  he memory has al
100b0 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c  ready.** been al
100c0 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69  located by a pri
100d0 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  or call to this 
100e0 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74  routine, so just
100f0 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a   return a copy.*
10100 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65  * of pBuf and le
10110 61 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  ave ReusableSpac
10120 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  e unchanged..**.
10130 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f  ** This allocato
10140 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f  r is employed to
10150 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65   repurpose unuse
10160 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65  d slots at the e
10170 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63  nd of the.** opc
10180 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65  ode array of pre
10190 70 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20  pared state for 
101a0 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65  other memory nee
101b0 64 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ds of the prepar
101c0 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  ed.** statement.
101d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
101e0 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73  *allocSpace(.  s
101f0 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
10200 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b  ace *p,  /* Bulk
10210 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   memory availabl
10220 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
10230 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
10240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10250 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
10260 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  prior allocation
10270 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
10280 74 36 34 20 6e 42 79 74 65 20 20 20 20 20 20 20  t64 nByte       
10290 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
102a0 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a  ry needed */.){.
102b0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
102c0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
102d0 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69  ->pSpace) );.  i
102e0 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
102f0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
10300 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
10310 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72   nByte <= p->nFr
10320 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ee ){.      p->n
10330 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20  Free -= nByte;. 
10340 20 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e       pBuf = &p->
10350 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d  pSpace[p->nFree]
10360 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10370 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d     p->nNeeded +=
10380 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20   nByte;.    }.  
10390 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
103a0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
103b0 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75  (pBuf) );.  retu
103c0 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
103d0 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
103e0 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
103f0 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
10400 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
10410 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
10420 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
10430 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
10440 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
10450 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
10460 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
10470 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
10480 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
10490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
104a0 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
104b0 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67  C_INIT || p->mag
104c0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
104d0 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ESET );..  /* Th
104e0 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
104f0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
10500 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
10510 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
10520 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
10530 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
10540 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
10550 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
10560 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
10570 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
10580 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
10590 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  UG.  for(i=0; i<
105a0 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
105b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
105c0 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
105d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
105e0 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
105f0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
10600 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
10610 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
10620 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
10630 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
10640 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
10650 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
10660 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
10670 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43  t = 0;.  p->nFkC
10680 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23  onstraint = 0;.#
10690 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
106a0 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
106b0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
106c0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
106d0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
106e0 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
106f0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
10700 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
10710 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
10720 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74   execution for t
10730 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66  he first time af
10740 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20  ter.** creating 
10750 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
10760 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ine.  This invol
10770 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
10780 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
10790 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69   registers and i
107a0 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
107b0 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
107c0 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
107d0 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
107e0 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
107f0 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
10800 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
10810 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
10820 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
10830 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
10840 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20   called exactly 
10850 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72  once on each vir
10860 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
10870 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
10880 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
10890 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
108a0 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
108b0 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
108c0 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
108d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
108e0 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f  further calls to
108f0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
10900 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
10910 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
10920 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10930 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
10940 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
10950 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
10960 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
10970 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
10980 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
10990 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
109a0 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
109b0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
109c0 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
109d0 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
109e0 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
109f0 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
10a00 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
10a10 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
10a20 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
10a30 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
10a40 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
10a50 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
10a60 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
10a70 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
10aa0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10ad0 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
10ae0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
10af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10b00 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
10b10 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
10b20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
10b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10b40 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
10b50 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
10b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10b80 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
10b90 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
10ba0 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10bc0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
10bd0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
10be0 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c00 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
10c10 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
10c20 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ams */.  int n; 
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10c50 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72  counter */.  str
10c60 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
10c70 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  e x;        /* R
10c80 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d  eusable bulk mem
10c90 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ory */..  assert
10ca0 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
10cb0 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
10cc0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
10cd0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10ce0 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
10cf0 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
10d00 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
10d10 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64  p->pParse );.  d
10d20 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
10d30 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
10d40 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56  ailed==0 );.  nV
10d50 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  ar = pParse->nVa
10d60 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72  r;.  nMem = pPar
10d70 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72  se->nMem;.  nCur
10d80 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
10d90 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61  ab;.  nArg = pPa
10da0 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20  rse->nMaxArg;.  
10db0 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73 6f  .  /* Each curso
10dc0 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79 20  r uses a memory 
10dd0 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73 74  cell.  The first
10de0 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72 20   cursor (cursor 
10df0 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20  0) can.  ** use 
10e00 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69 73  aMem[0] which is
10e10 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 75   not otherwise u
10e20 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  sed by the VDBE 
10e30 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61  program.  Alloca
10e40 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61 74  te.  ** space at
10e50 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d   the end of aMem
10e60 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20 31  [] for cursors 1
10e70 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20 20   and greater..  
10e80 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
10e90 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
10ea0 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
10eb0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75  ursor;.  if( nCu
10ec0 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e  rsor==0 && nMem>
10ed0 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20  0 ) nMem++;  /* 
10ee0 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30  Space for aMem[0
10ef0 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73  ] even if not us
10f00 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ed */..  /* Figu
10f10 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
10f20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20  reusable memory 
10f30 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  is available at 
10f40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
10f50 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79   ** opcode array
10f60 2e 20 20 54 68 69 73 20 65 78 74 72 61 20 6d 65  .  This extra me
10f70 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65 61  mory will be rea
10f80 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74 68  llocated for oth
10f90 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  er elements.  **
10fa0 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64   of the prepared
10fb0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
10fc0 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69  .  n = ROUND8(si
10fd0 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29  zeof(Op)*p->nOp)
10fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10ff0 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64  * Bytes of opcod
11000 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f  e memory used */
11010 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26 28  .  x.pSpace = &(
11020 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b  (u8*)p->aOp)[n];
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11040 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65 20  * Unused opcode 
11050 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
11060 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
11070 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63  LIGNMENT(x.pSpac
11080 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20  e) );.  x.nFree 
11090 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61  = ROUNDDOWN8(pPa
110a0 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d  rse->szOpAlloc -
110b0 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f   n);  /* Bytes o
110c0 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20  f unused memory 
110d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e  */.  assert( x.n
110e0 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Free>=0 );.  ass
110f0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
11100 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70  ALIGNMENT(&x.pSp
11110 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b  ace[x.nFree]) );
11120 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
11130 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
11140 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
11150 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
11160 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
11170 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
11180 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
11190 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
111a0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
111b0 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 43  char * const azC
111c0 6f 6c 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  olName[] = {.   
111d0 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70 63      "addr", "opc
111e0 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32 22  ode", "p1", "p2"
111f0 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22 70  , "p3", "p4", "p
11200 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 2c 0a 20  5", "comment",. 
11210 20 20 20 20 20 20 22 69 64 22 2c 20 22 70 61 72        "id", "par
11220 65 6e 74 22 2c 20 22 6e 6f 74 75 73 65 64 22 2c  ent", "notused",
11230 20 22 64 65 74 61 69 6c 22 0a 20 20 20 20 7d 3b   "detail".    };
11240 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 2c  .    int iFirst,
11250 20 6d 78 2c 20 69 3b 0a 20 20 20 20 69 66 28 20   mx, i;.    if( 
11260 6e 4d 65 6d 3c 31 30 20 29 20 6e 4d 65 6d 20 3d  nMem<10 ) nMem =
11270 20 31 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61   10;.    if( pPa
11280 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
11290 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
112a0 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 70  VdbeSetNumCols(p
112b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 46 69 72  , 4);.      iFir
112c0 73 74 20 3d 20 38 3b 0a 20 20 20 20 20 20 6d 78  st = 8;.      mx
112d0 20 3d 20 31 32 3b 0a 20 20 20 20 7d 65 6c 73 65   = 12;.    }else
112e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
112f0 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 70 2c  dbeSetNumCols(p,
11300 20 38 29 3b 0a 20 20 20 20 20 20 69 46 69 72 73   8);.      iFirs
11310 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 78 20  t = 0;.      mx 
11320 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 8;.    }.    f
11330 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 6d  or(i=iFirst; i<m
11340 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  x; i++){.      s
11350 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
11360 4e 61 6d 65 28 70 2c 20 69 2d 69 46 69 72 73 74  Name(p, i-iFirst
11370 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 0a  , COLNAME_NAME,.
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11390 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
113a0 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51 4c 49 54 45  lName[i], SQLITE
113b0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
113c0 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64    }.  p->expired
113d0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
113e0 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
113f0 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
11400 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
11410 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f  located in one o
11420 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  r two.  ** passe
11430 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
11440 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
11450 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65   reuse unused me
11460 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a  mory at the .  *
11470 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  * end of the opc
11480 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77  ode array.  If w
11490 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
114a0 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f  satisfy all memo
114b0 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d  ry.  ** requirem
114c0 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20  ents by reusing 
114d0 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
114e0 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20   tail, then the 
114f0 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73  second.  ** pass
11500 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68   will fill in th
11510 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e  e remainder usin
11520 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79  g a fresh memory
11530 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
11540 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77   **.  ** This tw
11550 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
11560 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
11570 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
11580 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a  ssible from.  **
11590 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65   the leftover me
115a0 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20  mory at the end 
115b0 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
115c0 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73  ray.  This can s
115d0 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
115e0 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
115f0 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
11600 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
11610 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
11620 0a 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30  .  x.nNeeded = 0
11630 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c  ;.  p->aMem = al
11640 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
11650 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
11660 29 3b 0a 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  );.  p->aVar = a
11670 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c  llocSpace(&x, 0,
11680 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
11690 29 29 3b 0a 20 20 70 2d 3e 61 70 41 72 67 20 3d  ));.  p->apArg =
116a0 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
116b0 30 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  0, nArg*sizeof(M
116c0 65 6d 2a 29 29 3b 0a 20 20 70 2d 3e 61 70 43 73  em*));.  p->apCs
116d0 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
116e0 78 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69  x, 0, nCursor*si
116f0 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
11700 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
11710 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
11720 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e  ANSTATUS.  p->an
11730 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
11740 65 28 26 78 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a  e(&x, 0, p->nOp*
11750 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
11760 6e 64 69 66 0a 20 20 69 66 28 20 78 2e 6e 4e 65  ndif.  if( x.nNe
11770 65 64 65 64 20 29 7b 0a 20 20 20 20 78 2e 70 53  eded ){.    x.pS
11780 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20  pace = p->pFree 
11790 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
117a0 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65  cRawNN(db, x.nNe
117b0 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72  eded);.    x.nFr
117c0 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a  ee = x.nNeeded;.
117d0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
117e0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
117f0 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
11800 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
11810 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
11820 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d  (Mem));.      p-
11830 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
11840 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20  ce(&x, p->aVar, 
11850 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
11860 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  );.      p->apAr
11870 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  g = allocSpace(&
11880 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  x, p->apArg, nAr
11890 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b  g*sizeof(Mem*));
118a0 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20  .      p->apCsr 
118b0 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
118c0 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73   p->apCsr, nCurs
118d0 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
118e0 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20  rsor*));.#ifdef 
118f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11900 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
11910 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
11920 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
11930 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
11940 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
11950 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
11960 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70  .  p->pVList = p
11970 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20  Parse->pVList;. 
11980 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
11990 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
119a0 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
119b0 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  lain;.  if( db->
119c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
119d0 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b      p->nVar = 0;
119e0 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
119f0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  = 0;.    p->nMem
11a00 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
11a10 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
11a20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e  nCursor;.    p->
11a30 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
11a40 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  ar;.    initMemA
11a50 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56  rray(p->aVar, nV
11a60 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  ar, db, MEM_Null
11a70 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  );.    p->nMem =
11a80 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d   nMem;.    initM
11a90 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
11aa0 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55   nMem, db, MEM_U
11ab0 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d  ndefined);.    m
11ac0 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20  emset(p->apCsr, 
11ad0 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
11ae0 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
11af0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11b00 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
11b10 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74  TATUS.    memset
11b20 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70  (p->anExec, 0, p
11b30 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
11b40 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ));.#endif.  }. 
11b50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
11b60 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
11b70 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
11b80 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
11b90 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
11ba0 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
11bb0 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
11bc0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
11bd0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
11be0 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
11bf0 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
11c00 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
11c10 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
11c20 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d  sert( pCx->pBtx=
11c30 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54  =0 || pCx->eCurT
11c40 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
11c50 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  EE );.  switch( 
11c60 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b  pCx->eCurType ){
11c70 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
11c80 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20  E_SORTER: {.    
11c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
11ca0 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
11cb0 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pCx);.      brea
11cc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11cd0 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a  e CURTYPE_BTREE:
11ce0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78   {.      if( pCx
11cf0 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  ->isEphemeral ){
11d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78  .        if( pCx
11d10 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33  ->pBtx ) sqlite3
11d20 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
11d30 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  pBtx);.        /
11d40 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
11d50 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
11d60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
11d70 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
11d80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
11d90 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
11da0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11db0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d      assert( pCx-
11dc0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
11dd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11de0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
11df0 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  r(pCx->uc.pCurso
11e00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
11e10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
11e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11e30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
11e40 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
11e50 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
11e60 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
11e70 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d  or *pVCur = pCx-
11e80 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20  >uc.pVCur;.     
11e90 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
11ea0 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
11eb0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70   pVCur->pVtab->p
11ec0 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73  Module;.      as
11ed0 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74  sert( pVCur->pVt
11ee0 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ab->nRef>0 );.  
11ef0 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62      pVCur->pVtab
11f00 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
11f10 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
11f20 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72  pVCur);.      br
11f30 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
11f40 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  f.  }.}../*.** C
11f50 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
11f60 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
11f70 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  frame..*/.static
11f80 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f   void closeCurso
11f90 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a  rsInFrame(Vdbe *
11fa0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
11fb0 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
11fc0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11fd0 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
11fe0 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
11ff0 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
12000 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
12010 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
12020 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
12030 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
12040 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
12050 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
12060 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12070 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
12080 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
12090 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
120a0 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
120b0 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
120c0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
120d0 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
120e0 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
120f0 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
12100 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
12110 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
12120 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
12130 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
12140 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
12150 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
12160 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75  me->v;.  closeCu
12170 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b  rsorsInFrame(v);
12180 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12190 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
121a0 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65  TATUS.  v->anExe
121b0 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78  c = pFrame->anEx
121c0 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e  ec;.#endif.  v->
121d0 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
121e0 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
121f0 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
12200 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
12210 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
12220 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
12230 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
12240 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
12250 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
12260 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
12270 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
12280 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
12290 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
122a0 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
122b0 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
122c0 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
122d0 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74  bChange;.  sqlit
122e0 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
122f0 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70  ata(v->db, &v->p
12300 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
12310 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  v->pAuxData =
12320 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
12330 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  a;.  pFrame->pAu
12340 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74  xData = 0;.  ret
12350 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
12360 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
12370 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
12380 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
12390 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
123a0 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
123b0 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
123c0 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
123d0 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
123e0 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
123f0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
12400 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
12410 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
12420 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
12430 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
12440 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
12450 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
12460 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
12470 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
12480 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
12490 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
124a0 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
124b0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
124c0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
124d0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
124e0 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
124f0 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
12500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
12510 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
12520 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
12530 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
12540 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
12550 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
12560 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
12570 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
12580 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
12590 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
125a0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
125b0 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
125c0 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
125d0 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
125e0 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
125f0 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
12600 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
12610 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
12620 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
12630 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
12640 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
12650 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
12660 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
12670 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
12680 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
12690 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
126a0 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26  AuxData(p->db, &
126b0 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
126c0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
126d0 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
126e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
126f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
12700 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
12710 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
12720 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
12730 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
12740 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
12750 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
12760 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
12770 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
12780 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
12790 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
127a0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
127b0 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
127c0 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
127d0 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
127e0 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
127f0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
12800 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
12810 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
12820 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
12830 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
12840 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65  b;..  if( p->nRe
12850 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72  sColumn ){.    r
12860 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
12870 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
12880 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
12890 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E_N);.    sqlite
128a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
128b0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ColName);.  }.  
128c0 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
128d0 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
128e0 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
128f0 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
12900 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  ->aColName = (Me
12910 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
12920 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
12930 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
12940 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
12950 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e  0 ) return;.  in
12960 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  itMemArray(p->aC
12970 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d  olName, n, db, M
12980 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  EM_Null);.}../*.
12990 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
129a0 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
129b0 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
129c0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
129d0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
129e0 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
129f0 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
12a00 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
12a10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
12a20 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
12a30 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
12a40 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
12a50 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
12a60 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
12a70 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
12a80 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
12a90 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
12aa0 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
12ab0 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
12ac0 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
12ad0 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
12ae0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
12af0 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
12b00 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
12b10 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
12b20 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
12b30 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
12b40 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
12b50 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
12b60 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
12b80 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
12b90 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
12ba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
12bc0 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
12bd0 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
12be0 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
12c10 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
12c20 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
12c30 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
12c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12c50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
12c60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
12c70 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
12c80 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
12c90 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
12ca0 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
12cb0 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
12cc0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
12cd0 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
12ce0 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
12cf0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
12d00 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
12d10 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
12d20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
12d30 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
12d40 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
12d50 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
12d60 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
12d70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
12d80 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
12d90 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
12da0 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
12db0 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
12dc0 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
12dd0 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
12de0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
12df0 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
12e00 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
12e10 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
12e20 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
12e30 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
12e40 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
12e50 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
12e60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12e70 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
12e80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
12e90 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
12ea0 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
12eb0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
12ec0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
12ed0 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
12ee0 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
12ef0 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
12f00 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
12f10 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
12f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
12f30 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
12f40 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
12f50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12f60 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
12f70 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
12f80 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
12f90 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
12fa0 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
12fb0 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
12fc0 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
12fd0 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
12fe0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e-transaction.  
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e   ** that are can
13010 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77  didates for a tw
13020 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75  o-phase commit u
13030 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20  sing a.         
13040 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73            ** mas
13050 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter-journal */. 
13060 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13070 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
13080 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
13090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
130a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
130b0 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
130c0 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
130d0 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
130e0 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
130f0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
13100 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
13110 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
13120 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
13130 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
13140 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
13150 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
13160 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
13170 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
13180 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
13190 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
131a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
131b0 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
131c0 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
131d0 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
131e0 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
131f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
13200 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
13210 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
13220 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
13230 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
13240 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
13250 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
13260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
13270 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
13280 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
13290 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
132a0 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
132b0 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
132c0 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
132d0 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
132e0 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
132f0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
13300 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
13310 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
13320 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
13330 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
13340 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
13350 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
13360 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
13370 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
13380 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
13390 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
133a0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
133b0 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
133c0 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
133d0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
133e0 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
133f0 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
13400 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
13410 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
13420 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
13430 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
13440 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
13450 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62  r or not a datab
13460 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61  ase might need a
13470 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13480 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20  depends upon.   
13490 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61     ** its journa
134a0 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74  l mode (among ot
134b0 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68  her things).  Th
134c0 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d  is matrix determ
134d0 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ines which.     
134e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65   ** journal mode
134f0 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a  s use a master j
13500 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68  ournal and which
13510 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20   do not */.     
13520 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
13530 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b   aMJNeeded[] = {
13540 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45  .        /* DELE
13550 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20  TE   */  1,.    
13560 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20      /* PERSIST  
13570 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
13580 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30  * OFF       */ 0
13590 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  ,.        /* TRU
135a0 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20  NCATE  */ 1,.   
135b0 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20       /* MEMORY  
135c0 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
135d0 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20  /* WAL       */ 
135e0 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
135f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
13600 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63    /* Pager assoc
13610 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a  iated with pBt *
13620 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  /.      needXcom
13630 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  mit = 1;.      s
13640 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13650 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61  (pBt);.      pPa
13660 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
13670 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
13680 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
13690 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  i].safety_level!
136a0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
136b0 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26  US_OFF.       &&
136c0 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74   aMJNeeded[sqlit
136d0 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
136e0 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20  lMode(pPager)]. 
136f0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
13700 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50 61  PagerIsMemdb(pPa
13710 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ger)==0.      ){
13720 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
13730 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i!=1 );.      
13740 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20    nTrans++;.    
13750 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
13760 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
13770 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
13780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
13790 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
137a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
137b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
137c0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
137d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
137e0 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
137f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
13800 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
13810 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
13820 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
13830 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
13840 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
13850 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
13860 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
13870 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
13880 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
13890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
138a0 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
138b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
138c0 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
138d0 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
138e0 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
138f0 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
13900 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
13910 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
13920 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
13930 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
13940 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
13950 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
13960 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
13970 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
13980 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
13990 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
139a0 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
139b0 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
139c0 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
139d0 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
139e0 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
139f0 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
13a00 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
13a10 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
13a20 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
13a30 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
13a40 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
13a50 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
13a60 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
13a70 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
13a80 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
13a90 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
13aa0 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
13ab0 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
13ac0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
13ad0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
13ae0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
13af0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
13b00 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
13b10 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
13b20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13b30 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
13b40 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
13b50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
13b60 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
13b70 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
13b80 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
13b90 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
13ba0 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
13bb0 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
13bc0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
13bd0 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
13be0 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
13bf0 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
13c00 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
13c10 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
13c20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
13c30 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
13c40 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
13c50 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
13c60 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
13c70 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
13c80 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
13c90 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
13ca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13cb0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
13cc0 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
13cd0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
13ce0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
13cf0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
13d00 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
13d10 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
13d20 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
13d30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
13d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d50 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
13d60 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
13d70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
13d80 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
13d90 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
13da0 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
13db0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
13dc0 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
13dd0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
13de0 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
13df0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13e00 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
13e10 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
13e20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
13e30 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
13e40 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
13e50 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
13e60 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61  b->pVfs;.    cha
13e70 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
13e80 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
13e90 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
13ea0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
13eb0 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
13ec0 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
13ed0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
13ee0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
13ef0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
13f00 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
13f10 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
13f20 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
13f30 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
13f40 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
13f50 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
13f60 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
13f70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
13f80 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
13f90 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
13fa0 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
13fb0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
13fc0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
13fd0 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
13fe0 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
13ff0 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
14000 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
14010 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14020 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
14030 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
14040 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
14050 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
14060 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
14070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
14080 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
14090 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
140a0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
140b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
140c0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
140d0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
140e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
140f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
14100 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
14110 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
14120 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
14130 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
14140 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
14150 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14160 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
14170 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
14180 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
14190 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
141a0 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
141b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
141c0 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
141d0 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
141e0 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
14210 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
14220 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
14230 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
14240 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
14250 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
14260 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
14270 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
14280 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
14290 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
142a0 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
142b0 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
142c0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
142d0 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
142e0 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
142f0 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
14300 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
14310 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
14320 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
14330 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
14340 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
14350 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
14360 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
14370 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
14380 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
14390 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
143a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
143b0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
143c0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
143d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
143e0 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
143f0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
14400 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
14410 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
14420 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
14430 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
14440 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14450 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
14460 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
14470 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
14480 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
144a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
144b0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
144c0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
144d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
144e0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
144f0 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
14500 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
14510 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
14520 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
14530 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14540 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
14550 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
14560 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
14570 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
14580 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
14590 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
145a0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
145b0 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
145c0 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
145d0 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
145e0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
145f0 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
14600 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
14610 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
14620 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
14630 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
14640 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
14650 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
14660 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
14670 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
14680 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
14690 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
146a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
146b0 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
146c0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
146d0 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
146e0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
146f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14700 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
14710 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
14720 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
14730 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
14740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
14750 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
14760 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14770 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
14780 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
14790 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
147a0 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
147b0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
147c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
147d0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
147e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
147f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
14800 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
14810 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
14820 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
14830 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
14840 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
14850 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14860 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
14870 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14880 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
14890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
148a0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
148b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
148c0 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
148d0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
148e0 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
148f0 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
14900 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
14910 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c  .    if( 0==(sql
14920 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
14930 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
14940 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
14950 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
14960 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
14970 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
14980 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
14990 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
149a0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
149b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
149c0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
149d0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
149e0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
149f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
14a00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
14a10 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
14a20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
14a30 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
14a40 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
14a50 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
14a60 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
14a70 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
14a80 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
14a90 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
14aa0 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
14ab0 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
14ac0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
14ad0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
14ae0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
14af0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14b00 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
14b10 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
14b20 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
14b30 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
14b40 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
14b50 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
14b60 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
14b70 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
14b80 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
14b90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
14ba0 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
14bb0 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
14bc0 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
14bd0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
14be0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
14bf0 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
14c00 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
14c10 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
14c20 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
14c30 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
14c40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
14c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
14c60 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
14c70 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
14c80 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
14c90 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
14ca0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
14cb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
14cc0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
14cd0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
14ce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
14cf0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
14d00 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
14d10 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
14d20 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
14d30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14d40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14d50 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
14d60 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
14d70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
14d80 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
14d90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
14da0 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
14db0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14dc0 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
14dd0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
14de0 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
14df0 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
14e00 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
14e10 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
14e20 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
14e30 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
14e40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
14e50 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
14e60 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
14e70 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
14e80 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
14e90 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
14ea0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
14eb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
14ec0 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
14ed0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
14ee0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
14ef0 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
14f00 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
14f10 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
14f20 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14f30 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
14f40 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
14f50 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
14f60 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
14f70 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
14f80 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
14f90 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
14fa0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
14fb0 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
14fc0 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
14fd0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
14fe0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
14ff0 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
15000 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
15010 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
15020 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
15030 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
15040 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
15050 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
15060 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
15070 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
15080 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
15090 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
150a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
150b0 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
150c0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
150d0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
150e0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
150f0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
15100 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
15110 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
15120 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
15130 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
15140 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
15150 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
15160 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
15170 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
15180 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
15190 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
151a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
151b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
151c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
151d0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
151e0 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
151f0 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
15200 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
15210 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
15220 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
15230 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
15240 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
15250 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
15260 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
15270 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
15280 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
15290 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
152a0 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
152b0 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
152c0 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
152d0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
152e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
152f0 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
15300 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
15310 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
15320 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
15330 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
15340 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
15350 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
15360 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
15370 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
15380 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
15390 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
153a0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
153b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
153c0 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
153d0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
153e0 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
153f0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
15400 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
15410 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
15420 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
15430 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
15440 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
15450 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
15460 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
15470 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
15480 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
15490 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
154a0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
154b0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
154c0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
154d0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
154e0 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
154f0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
15500 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
15510 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
15520 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
15530 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
15540 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
15550 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
15560 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
15570 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
15580 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
15590 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
155a0 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
155b0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
155c0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
155d0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
155e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
155f0 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
15600 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
15610 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
15620 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
15630 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
15640 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
15650 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
15660 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
15670 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
15680 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  _OK..*/.static S
15690 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
156a0 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  nt vdbeCloseStat
156b0 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
156c0 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
156d0 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
156e0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
156f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
15700 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  t i;.  const int
15710 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
15720 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
15730 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
15740 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15750 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
15760 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
15770 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
15780 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
15790 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
157a0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
157b0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
157c0 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69  int) );..  for(i
157d0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
157e0 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63  ++){ .    int rc
157f0 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
15800 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
15810 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
15820 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
15830 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
15840 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
15850 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20   ){.        rc2 
15860 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
15870 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
15880 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
15890 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
158a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
158b0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
158c0 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  {.        rc2 = 
158d0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
158e0 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
158f0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
15900 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
15910 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
15920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15930 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
15940 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15950 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  }.  db->nStateme
15960 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74  nt--;.  p->iStat
15970 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ement = 0;..  if
15980 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15990 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  ){.    if( eOp==
159a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
159b0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
159c0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
159d0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
159e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
159f0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
15a00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15a10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15a20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
15a30 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
15a40 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
15a50 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
15a60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
15a70 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
15a80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
15a90 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
15aa0 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
15ab0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
15ac0 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
15ad0 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
15ae0 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
15af0 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
15b00 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
15b10 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
15b20 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
15b30 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
15b40 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
15b50 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
15b60 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
15b70 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  efCons;.    db->
15b80 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
15b90 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
15ba0 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74  mCons;.  }.  ret
15bb0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
15bc0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
15bd0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
15be0 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28   int eOp){.  if(
15bf0 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65   p->db->nStateme
15c00 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
15c10 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ent ){.    retur
15c20 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  n vdbeCloseState
15c30 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20  ment(p, eOp);.  
15c40 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15c50 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
15c60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15c70 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
15c80 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
15c90 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
15ca0 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
15cb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
15cc0 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
15cd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
15ce0 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
15cf0 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
15d00 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
15d10 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
15d20 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
15d30 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
15d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15d50 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
15d60 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
15d70 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
15d80 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
15d90 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
15da0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
15db0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
15dc0 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
15dd0 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
15de0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
15df0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
15e00 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
15e10 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
15e20 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
15e30 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
15e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15e50 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
15e60 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
15e70 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
15e80 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
15e90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
15ea0 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
15eb0 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
15ec0 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
15ed0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
15ee0 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
15ef0 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
15f00 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
15f10 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
15f20 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
15f30 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
15f40 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
15f50 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
15f60 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
15f70 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
15f80 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
15f90 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
15fa0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15fb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15fc0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
15fd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15fe0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
15ff0 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
16000 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
16010 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
16020 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
16030 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
16040 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
16050 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
16060 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
16070 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
16080 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
16090 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
160a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
160b0 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
160c0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
160d0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
160e0 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
160f0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
16100 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
16110 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
16120 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
16130 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
16140 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
16150 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
16160 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
16170 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
16180 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
16190 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
161a0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
161b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
161c0 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
161d0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
161e0 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
161f0 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
16200 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
16210 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
16220 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16230 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
16240 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
16270 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
16280 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
16290 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
162a0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
162b0 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
162c0 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
162d0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
162e0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
162f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
16300 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
16310 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
16320 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
16330 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
16340 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
16350 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
16360 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
16370 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
16380 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
16390 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
163a0 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
163b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
163c0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
163d0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
163e0 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
163f0 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
16400 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
16410 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
16420 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
16430 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
16440 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
16450 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
16460 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
16470 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
16480 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
16490 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
164a0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
164b0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
164c0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
164d0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
164e0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
164f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16500 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16510 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
16520 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
16530 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
16540 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  KPT;.  }.  close
16550 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
16560 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
16570 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
16580 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
16590 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
165a0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
165b0 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
165c0 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
165d0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
165e0 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
165f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
16600 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
16610 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
16620 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
16630 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
16640 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
16650 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
16660 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
16670 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
16680 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
16690 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
166a0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
166b0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
166c0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
166d0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
166e0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
166f0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
16700 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
16710 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
16720 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
16730 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
16740 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
16750 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
16760 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
16770 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
16780 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
167a0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
167b0 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
167c0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
167d0 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
167e0 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
167f0 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
16800 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
16810 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
16820 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
16830 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
16840 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
16850 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
16860 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
16870 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
16880 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
16890 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
168a0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
168b0 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
168c0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
168d0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
168e0 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
168f0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
16900 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
16910 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
16920 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
16930 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
16940 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
16950 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
16960 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
16970 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
16980 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
16990 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
169a0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
169b0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
169c0 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
169d0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
169e0 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
169f0 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
16a00 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
16a10 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
16a20 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
16a30 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
16a40 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
16a50 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
16a60 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
16a70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16a80 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
16a90 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
16aa0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
16ab0 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
16ac0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
16ad0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
16ae0 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
16af0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
16b00 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
16b10 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
16b20 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
16b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16b40 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
16b50 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
16b60 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
16b70 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
16b80 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
16b90 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
16ba0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
16bb0 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
16bc0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
16bd0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
16be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16bf0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
16c00 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
16c10 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
16c20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
16c30 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
16c40 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
16c50 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
16c60 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
16c70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
16c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
16c90 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
16ca0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
16cb0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
16cc0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
16cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
16ce0 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
16cf0 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
16d00 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
16d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16d20 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
16d30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16d40 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
16d50 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
16d60 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
16d70 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
16d80 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
16d90 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
16da0 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
16db0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
16dc0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
16dd0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
16de0 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
16df0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
16e00 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
16e10 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
16e20 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
16e30 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
16e40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
16e50 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
16e60 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
16e70 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
16e80 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
16e90 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
16ea0 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
16eb0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
16ec0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
16ed0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
16ee0 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
16ef0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
16f00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16f10 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
16f20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16f30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16f40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
16f50 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
16f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16f70 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
16f80 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
16f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
16fa0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
16fb0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
16fc0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
16fd0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
16fe0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
16ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17000 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
17010 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
17020 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
17030 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
17040 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
17050 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
17060 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
17070 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
17080 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
17090 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
170a0 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
170b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
170c0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
170d0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
170e0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
170f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
17100 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
17110 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
17120 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
17130 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
17140 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
17150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17160 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
17170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17180 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
17190 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
171a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
171b0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
171c0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
171d0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
171e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
171f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
17200 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
17210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17220 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
17230 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
17240 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
17250 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
17260 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
17270 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49  gs &= ~(u64)SQLI
17280 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
17290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
172a0 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
172b0 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
172c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
172d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
172e0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
172f0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
17300 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
17310 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
17320 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
17330 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
17340 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
17350 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
17360 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
17370 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
17380 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
17390 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
173a0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
173b0 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
173c0 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
173d0 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
173e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
173f0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
17400 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
17410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17420 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
17430 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
17440 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
17450 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
17460 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
17470 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
17480 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
17490 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
174a0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
174b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
174c0 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
174d0 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
174e0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
174f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
17500 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
17510 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
17520 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
17530 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
17540 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
17550 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
17560 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
17570 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
17580 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
17590 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
175a0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
175b0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
175c0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
175d0 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
175e0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
175f0 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
17600 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
17610 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
17620 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
17630 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
17640 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
17650 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
17660 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17670 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
17680 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
17690 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
176a0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
176b0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
176c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
176d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
176e0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
176f0 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
17700 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
17710 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
17720 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
17730 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
17740 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
17750 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
17760 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
17770 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
17780 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
17790 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
177a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
177b0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
177c0 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
177d0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
177e0 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
177f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
17800 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
17810 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
17820 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
17830 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
17840 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
17850 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
17860 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
17870 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
17880 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
17890 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
178a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
178b0 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
178c0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
178d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
178e0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
178f0 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
17900 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
17910 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
17920 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
17930 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
17940 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
17950 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
17960 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
17970 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
17980 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
17990 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
179a0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
179b0 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
179c0 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
179d0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
179e0 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
179f0 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
17a00 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
17a10 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
17a20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
17a30 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
17a40 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
17a50 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
17a60 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
17a70 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
17a80 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
17a90 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
17aa0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
17ab0 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
17ac0 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
17ad0 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
17ae0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17af0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
17b00 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
17b10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
17b20 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
17b30 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
17b40 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
17b50 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
17b60 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
17b70 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
17b80 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
17b90 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
17ba0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
17bb0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
17bc0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
17bd0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
17be0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
17bf0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
17c00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
17c10 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
17c20 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
17c30 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
17c40 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
17c50 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
17c60 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
17c70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
17c80 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
17c90 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
17ca0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
17cb0 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
17cc0 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
17cd0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
17ce0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
17cf0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
17d00 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
17d10 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
17d20 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
17d30 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
17d40 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
17d50 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
17d60 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
17d70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17d80 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
17d90 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
17da0 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
17db0 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
17dc0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
17dd0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
17de0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
17df0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
17e00 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
17e10 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
17e20 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
17e30 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
17e40 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
17e50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17e60 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
17e70 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
17e80 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
17e90 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
17ea0 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
17eb0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
17ec0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
17ed0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
17ee0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
17ef0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
17f00 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
17f10 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
17f20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
17f30 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
17f40 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
17f50 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
17f60 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
17f70 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
17f80 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
17f90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
17fa0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
17fb0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
17fc0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
17fd0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
17fe0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
17ff0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
18000 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
18010 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73  Malloc--;.  }els
18020 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29  e if( db->pErr )
18030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
18040 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45  ueSetNull(db->pE
18050 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65  rr);.  }.  db->e
18060 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72  rrCode = rc;.  r
18070 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
18080 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18090 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
180a0 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
180b0 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
180c0 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
180d0 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
180e0 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
180f0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
18100 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
18110 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
18120 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
18130 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
18140 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
18150 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
18160 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
18170 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
18180 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
18190 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
181a0 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
181b0 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
181c0 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
181d0 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
181e0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
181f0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
18200 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
18210 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18220 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
18230 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
18240 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
18250 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
18260 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
18270 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
18280 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
18290 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
182a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
182b0 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
182c0 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
182d0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
182e0 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
182f0 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
18300 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
18310 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
18320 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
18330 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
18340 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
18350 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
18360 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
18370 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
18380 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
18390 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
183a0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
183b0 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
183c0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
183d0 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
183e0 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
183f0 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
18400 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
18410 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
18420 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
18430 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
18440 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
18450 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
18460 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
18470 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
18480 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   i;.#endif..  sq
18490 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
184a0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
184b0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
184c0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
184d0 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
184e0 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
184f0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
18500 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
18510 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
18520 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
18530 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
18540 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
18550 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
18560 65 20 56 44 42 45 20 68 61 73 20 62 65 65 6e 20  e VDBE has been 
18570 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
18580 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
18590 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
185a0 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
185b0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
185c0 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
185d0 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
185e0 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
185f0 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
18600 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
18610 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
18620 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
18630 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
18640 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
18650 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
18660 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
18670 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
18680 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
18690 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
186a0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
186b0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
186c0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
186d0 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  r(p);.    if( p-
186e0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
186f0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
18700 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
18710 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
18720 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
18730 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
18740 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
18750 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
18760 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
18770 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
18780 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
18790 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
187a0 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
187b0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
187c0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
187d0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
187e0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
187f0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
18800 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
18810 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
18820 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
18830 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  );.  }..  /* Res
18840 65 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  et register cont
18850 65 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d  ents and reclaim
18860 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
18870 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64  emory..  */.#ifd
18880 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
18890 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
188a0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
188b0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
188c0 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
188d0 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
188e0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
188f0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
18900 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
18910 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
18920 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
18930 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
18940 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
18950 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
18960 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
18970 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
18980 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
18990 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
189a0 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
189b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
189c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
189d0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
189e0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
189f0 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
18a00 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
18a10 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69  _DEBUG.  p->nWri
18a20 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
18a30 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
18a40 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
18a50 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
18a60 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
18a70 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
18a80 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
18a90 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
18aa0 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
18ab0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
18ac0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
18ad0 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
18ae0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
18af0 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
18b00 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18b10 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
18b20 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
18b30 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
18b40 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
18b50 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20      if( p->zSql 
18b60 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
18b70 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20  c, pc = 0;.     
18b80 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
18b90 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
18ba0 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d  for(i=0; (c = p-
18bb0 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b  >zSql[i])!=0; i+
18bc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
18bd0 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc=='\n' ) fpr
18be0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
18bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63  ;.          putc
18c00 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
18c10 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
18c20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
18c30 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc!='\n' ) fpr
18c40 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
18c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
18c60 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
18c70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18c80 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a  char zHdr[100];.
18c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
18ca0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
18cb0 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36  zHdr), zHdr, "%6
18cc0 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22  u %12llu %8llu "
18cd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
18ce0 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
18cf0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
18d00 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
18d10 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
18d20 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
18d30 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
18d40 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
18d50 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
18d60 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
18d70 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Hdr);.        sq
18d80 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
18d90 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
18da0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
18db0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
18dc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
18dd0 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
18de0 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b  DBE_MAGIC_RESET;
18df0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
18e00 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
18e10 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
18e20 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
18e30 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
18e40 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
18e50 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
18e60 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
18e70 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
18e80 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
18e90 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
18ea0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
18eb0 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
18ec0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
18ed0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18ee0 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
18ef0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
18f00 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
18f10 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
18f20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
18f30 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
18f40 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
18f50 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
18f60 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
18f70 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
18f80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18f90 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
18fa0 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
18fb0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
18fc0 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
18fd0 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
18fe0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
18ff0 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
19000 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
19010 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
19020 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
19030 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
19040 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
19050 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
19060 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
19070 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
19080 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
19090 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
190a0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
190b0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
190c0 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
190d0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
190e0 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
190f0 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
19100 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
19110 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
19120 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
19130 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
19140 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
19150 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
19160 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
19170 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
19180 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
19190 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
191a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
191b0 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
191c0 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
191d0 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
191e0 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
191f0 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
19200 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
19210 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
19220 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
19230 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33  eAuxData(sqlite3
19240 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a   *db, AuxData **
19250 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  pp, int iOp, int
19260 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28   mask){.  while(
19270 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
19280 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
19290 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
192a0 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
192b0 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20  iAuxOp==iOp.    
192c0 20 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69        && pAux->i
192d0 41 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20  AuxArg>=0.      
192e0 20 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41      && (pAux->iA
192f0 75 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61  uxArg>31 || !(ma
19300 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70  sk & MASKBIT32(p
19310 41 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29  Aux->iAuxArg))))
19320 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
19330 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
19340 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  uxArg==31 );.   
19350 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
19360 6c 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20  leteAux ){.     
19370 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
19380 41 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  Aux(pAux->pAux);
19390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
193a0 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  pp = pAux->pNext
193b0 41 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Aux;.      sqlit
193c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75  e3DbFree(db, pAu
193d0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
193e0 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
193f0 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a  pNextAux;.    }.
19400 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
19410 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
19420 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
19430 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
19440 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19450 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
19460 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
19470 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
19480 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
19490 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
194a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
194b0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
194c0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
194d0 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
194e0 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
194f0 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
19500 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
19510 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
19520 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
19530 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
19540 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
19550 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
19560 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
19570 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
19580 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
19590 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
195a0 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
195b0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
195c0 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
195d0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
195e0 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
195f0 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
19600 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
19610 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
19620 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
19630 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
19640 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
19650 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
19660 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
19670 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
19680 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
19690 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d  ;.  }.  if( p->m
196a0 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
196b0 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c  _INIT ){.    rel
196c0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
196d0 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
196e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
196f0 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29  e(db, p->pVList)
19700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
19710 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
19720 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65  );.  }.  vdbeFre
19730 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
19740 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
19750 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19760 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
19770 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19780 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69  db, p->zSql);.#i
19790 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
197a0 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73  LE_NORMALIZE.  s
197b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
197c0 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 20   p->zNormSql);. 
197d0 20 7b 0a 20 20 20 20 44 62 6c 71 75 6f 74 65 53   {.    DblquoteS
197e0 74 72 20 2a 70 54 68 69 73 2c 20 2a 70 4e 65 78  tr *pThis, *pNex
197f0 74 3b 0a 20 20 20 20 66 6f 72 28 70 54 68 69 73  t;.    for(pThis
19800 3d 70 2d 3e 70 44 62 6c 53 74 72 3b 20 70 54 68  =p->pDblStr; pTh
19810 69 73 3b 20 70 54 68 69 73 3d 70 4e 65 78 74 29  is; pThis=pNext)
19820 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
19830 70 54 68 69 73 2d 3e 70 4e 65 78 74 53 74 72 3b  pThis->pNextStr;
19840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
19850 46 72 65 65 28 64 62 2c 20 70 54 68 69 73 29 3b  Free(db, pThis);
19860 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
19870 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
19880 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
19890 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69  STATUS.  {.    i
198a0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
198b0 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69  0; i<p->nScan; i
198c0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
198d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
198e0 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  aScan[i].zName);
198f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19900 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
19910 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  aScan);.  }.#end
19920 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
19930 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
19940 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
19950 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
19960 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
19970 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   *db;..  assert(
19980 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
19990 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
199a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
199b0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
199c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
199d0 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
199e0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
199f0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
19a00 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
19a10 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
19a20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
19a30 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
19a40 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
19a50 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
19a60 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
19a70 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
19a80 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
19a90 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
19aa0 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
19ab0 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
19ac0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
19ad0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
19ae0 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61  cursor "p" has a
19af0 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70   pending seek op
19b00 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73  eration that has
19b10 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a   not yet been.**
19b20 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53   carried out.  S
19b30 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e  eek the cursor n
19b40 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  ow.  If an error
19b50 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a   occurs, return.
19b60 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
19b70 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
19b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
19b90 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
19ba0 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
19bb0 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
19bc0 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b  {.  int res, rc;
19bd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19be0 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  EST.  extern int
19bf0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
19c00 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
19c10 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72  assert( p->defer
19c20 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61  redMoveto );.  a
19c30 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
19c40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
19c50 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
19c60 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72  YPE_BTREE );.  r
19c70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19c80 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
19c90 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c  ->uc.pCursor, 0,
19ca0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
19cb0 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  , 0, &res);.  if
19cc0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19cd0 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29  ;.  if( res!=0 )
19ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19cf0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66  ORRUPT_BKPT;.#if
19d00 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
19d10 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
19d20 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
19d30 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  .  p->deferredMo
19d40 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  veto = 0;.  p->c
19d50 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
19d60 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75  HE_STALE;.  retu
19d70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19d80 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67  ./*.** Something
19d90 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f   has moved curso
19da0 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61  r "p" out of pla
19db0 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72  ce.  Maybe the r
19dc0 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69  ow it was.** poi
19dd0 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65  nted to was dele
19de0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
19df0 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65  er it.  Or maybe
19e00 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a   the btree was.*
19e10 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57  * rebalanced.  W
19e20 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73  hatever the caus
19e30 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72  e, try to restor
19e40 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61  e "p" to the pla
19e50 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70  ce it.** is supp
19e60 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  osed to be point
19e70 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77  ing.  If the row
19e80 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
19e90 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a   from under the.
19ea0 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74  ** cursor, set t
19eb0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
19ec0 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77  nt to a NULL row
19ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19ee0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
19ef0 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
19f00 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  r(VdbeCursor *p)
19f10 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72  {.  int isDiffer
19f20 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73  entRow, rc;.  as
19f30 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
19f40 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
19f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
19f60 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
19f70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
19f80 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
19f90 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
19fa0 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  rsor) );.  rc = 
19fb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
19fc0 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e  orRestore(p->uc.
19fd0 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66  pCursor, &isDiff
19fe0 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e  erentRow);.  p->
19ff0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
1a000 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
1a010 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20   isDifferentRow 
1a020 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
1a030 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a040 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
1a050 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1a060 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
1a070 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  .  Restore the c
1a080 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64  ursor.** if need
1a090 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79   be.  Return any
1a0a0 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20   I/O error from 
1a0b0 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72  the restore oper
1a0c0 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
1a0d0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52  lite3VdbeCursorR
1a0e0 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f  estore(VdbeCurso
1a0f0 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
1a100 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
1a110 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
1a120 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1a130 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
1a140 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
1a150 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
1a160 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
1a170 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a190 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1a1a0 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
1a1b0 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
1a1c0 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
1a1d0 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
1a1e0 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
1a1f0 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
1a200 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
1a210 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
1a220 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
1a230 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
1a240 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
1a250 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
1a260 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
1a270 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
1a280 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
1a290 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
1a2a0 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
1a2b0 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
1a2c0 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
1a2d0 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
1a2e0 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
1a2f0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
1a300 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
1a310 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
1a320 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
1a330 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
1a340 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
1a350 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
1a360 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
1a370 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
1a380 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
1a390 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
1a3a0 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
1a3b0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
1a3c0 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
1a3d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1a3e0 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
1a3f0 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
1a400 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
1a410 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29  *pp, int *piCol)
1a420 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
1a430 70 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72  p = *pp;.  asser
1a440 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
1a450 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c  CURTYPE_BTREE ||
1a460 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
1a470 52 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a  RTYPE_PSEUDO );.
1a480 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
1a490 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
1a4a0 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28  nt iMap;.    if(
1a4b0 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28   p->aAltMap && (
1a4c0 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61  iMap = p->aAltMa
1a4d0 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29  p[1+*piCol])>0 )
1a4e0 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  {.      *pp = p-
1a4f0 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20  >pAltCursor;.   
1a500 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70     *piCol = iMap
1a510 20 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   - 1;.      retu
1a520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a530 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68    }.    return h
1a540 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
1a550 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66  eto(p);.  }.  if
1a560 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
1a570 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
1a580 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
1a590 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
1a5a0 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
1a5b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1a5c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1a5d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1a5e0 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
1a5f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1a600 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
1a610 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1a620 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
1a630 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
1a640 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
1a650 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
1a660 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1a670 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
1a680 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
1a690 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
1a6a0 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
1a6b0 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
1a6c0 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
1a6d0 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
1a6e0 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
1a6f0 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
1a700 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
1a710 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
1a720 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
1a730 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
1a740 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
1a750 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
1a760 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
1a770 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
1a780 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
1a790 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
1a7a0 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
1a7b0 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
1a7c0 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
1a7d0 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
1a7e0 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
1a7f0 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
1a800 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
1a810 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1a820 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
1a830 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
1a840 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
1a850 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
1a860 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
1a870 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
1a880 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
1a890 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
1a8a0 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
1a8b0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1a8c0 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
1a8d0 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
1a8e0 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
1a8f0 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
1a900 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
1a910 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
1a920 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
1a930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
1a940 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1a950 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
1a960 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
1a990 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
1a9c0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
1a9d0 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
1a9f0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
1aa00 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
1aa10 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
1aa20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
1aa30 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
1aa40 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
1aa70 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
1aa80 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
1aaa0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
1aab0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
1aac0 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
1aad0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
1aae0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
1aaf0 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
1ab20 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
1ab30 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
1ab40 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
1ab50 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
1ab60 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
1ab90 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
1aba0 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1abd0 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
1abe0 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
1abf0 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
1ac00 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
1ac10 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
1ac20 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
1ac30 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
1ac40 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
1ac50 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
1ac60 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
1ac70 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
1ac80 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
1ac90 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
1aca0 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
1acb0 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
1acc0 74 79 70 65 73 2e 0a 2a 2f 0a 0a 23 69 66 20 30  types..*/..#if 0
1acd0 20 2f 2a 20 49 6e 6c 69 6e 65 64 20 69 6e 74 6f   /* Inlined into
1ace0 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1acf0 72 64 20 6f 70 63 6f 64 65 20 2a 2f 0a 2f 2a 0a  rd opcode */./*.
1ad00 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
1ad10 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
1ad20 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
1ad30 6e 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  n pMem..**.** Th
1ad40 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
1ad50 20 63 6f 6e 76 65 72 74 20 61 20 6c 61 72 67 65   convert a large
1ad60 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 76 61 6c   MEM_IntReal val
1ad70 75 65 20 69 6e 74 6f 20 4d 45 4d 5f 52 65 61 6c  ue into MEM_Real
1ad80 2e 0a 2a 2a 0a 2a 2a 20 32 30 31 39 2d 30 37 2d  ..**.** 2019-07-
1ad90 31 31 3a 20 20 54 68 65 20 70 72 69 6d 61 72 79  11:  The primary
1ada0 20 75 73 65 72 20 6f 66 20 74 68 69 73 20 73 75   user of this su
1adb0 62 72 6f 75 74 69 6e 65 20 77 61 73 20 74 68 65  broutine was the
1adc0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 0a 2a   OP_MakeRecord.*
1add0 2a 20 6f 70 63 6f 64 65 20 69 6e 20 74 68 65 20  * opcode in the 
1ade0 62 79 74 65 2d 63 6f 64 65 20 65 6e 67 69 6e 65  byte-code engine
1adf0 2e 20 20 42 75 74 20 62 79 20 6d 6f 76 69 6e 67  .  But by moving
1ae00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
1ae10 2d 6c 69 6e 65 2c 20 77 65 0a 2a 2a 20 63 61 6e  -line, we.** can
1ae20 20 6f 6d 69 74 20 73 6f 6d 65 20 72 65 64 75 6e   omit some redun
1ae30 64 61 6e 74 20 74 65 73 74 73 20 61 6e 64 20 6d  dant tests and m
1ae40 61 6b 65 20 74 68 61 74 20 6f 70 63 6f 64 65 20  ake that opcode 
1ae50 61 20 6c 6f 74 20 66 61 73 74 65 72 2e 20 20 53  a lot faster.  S
1ae60 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
1ae70 65 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 20 75 73  e is now only us
1ae80 65 64 20 62 79 20 74 68 65 20 53 54 41 54 33 20  ed by the STAT3 
1ae90 6c 6f 67 69 63 20 61 6e 64 20 53 54 41 54 33 20  logic and STAT3 
1aea0 73 75 70 70 6f 72 74 20 68 61 73 0a 2a 2a 20 65  support has.** e
1aeb0 6e 64 65 64 2e 20 20 54 68 65 20 63 6f 64 65 20  nded.  The code 
1aec0 69 73 20 6b 65 70 74 20 68 65 72 65 20 66 6f 72  is kept here for
1aed0 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 66 65   historical refe
1aee0 72 65 6e 63 65 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75  rence only..*/.u
1aef0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1af00 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
1af10 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
1af20 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b  mat, u32 *pLen){
1af30 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
1af40 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33  Mem->flags;.  u3
1af50 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  2 n;..  assert( 
1af60 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28  pLen!=0 );.  if(
1af70 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
1af80 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30  ){.    *pLen = 0
1af90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1afa0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
1afb0 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74  (MEM_Int|MEM_Int
1afc0 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Real) ){.    /* 
1afd0 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
1afe0 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
1aff0 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
1b000 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
1b010 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
1b020 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
1b030 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
1b040 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
1b050 75 36 34 20 75 3b 0a 20 20 20 20 74 65 73 74 63  u64 u;.    testc
1b060 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1b070 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74 65 73 74  _Int );.    test
1b080 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
1b090 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20  M_IntReal );.   
1b0a0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1b0b0 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
1b0c0 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
1b0d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b0e0 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
1b0f0 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
1b100 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
1b110 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
1b120 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
1b130 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
1b140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b150 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
1b160 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1b170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b180 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
1b190 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
1b1a0 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
1b1b0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
1b1c0 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
1b1d0 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
1b1e0 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
1b1f0 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
1b200 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
1b210 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
1b220 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
1b230 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
1b240 20 38 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67   8;.    if( flag
1b250 73 26 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 7b  s&MEM_IntReal ){
1b260 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1b270 20 76 61 6c 75 65 20 69 73 20 49 6e 74 52 65 61   value is IntRea
1b280 6c 20 61 6e 64 20 69 73 20 67 6f 69 6e 67 20 74  l and is going t
1b290 6f 20 74 61 6b 65 20 75 70 20 38 20 62 79 74 65  o take up 8 byte
1b2a0 73 20 74 6f 20 73 74 6f 72 65 0a 20 20 20 20 20  s to store.     
1b2b0 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65 67 65   ** as an intege
1b2c0 72 2c 20 74 68 65 6e 20 77 65 20 6d 69 67 68 74  r, then we might
1b2d0 20 61 73 20 77 65 6c 6c 20 6d 61 6b 65 20 69 74   as well make it
1b2e0 20 61 6e 20 38 2d 62 79 74 65 20 66 6c 6f 61 74   an 8-byte float
1b2f0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 6f 69  ing.      ** poi
1b300 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  nt value */.    
1b310 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20 28 64    pMem->u.r = (d
1b320 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e 75 2e 69 3b  ouble)pMem->u.i;
1b330 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1b340 67 73 20 26 3d 20 7e 4d 45 4d 5f 49 6e 74 52 65  gs &= ~MEM_IntRe
1b350 61 6c 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  al;.      pMem->
1b360 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61  flags |= MEM_Rea
1b370 6c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  l;.      return 
1b380 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  7;.    }.    ret
1b390 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
1b3a0 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
1b3b0 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38  ){.    *pLen = 8
1b3c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  ;.    return 7;.
1b3d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
1b3e0 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
1b3f0 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
1b400 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
1b410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
1b420 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
1b430 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
1b440 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
1b450 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
1b460 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
1b470 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20  ;.  }.  *pLen = 
1b480 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  n;.  return ((n*
1b490 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
1b4a0 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
1b4b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 6e 6c  .}.#endif /* inl
1b4c0 69 6e 65 64 20 69 6e 74 6f 20 4f 50 5f 4d 61 6b  ined into OP_Mak
1b4d0 65 52 65 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a  eRecord */../*.*
1b4e0 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20  * The sizes for 
1b4f0 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73  serial types les
1b500 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74  s than 128.*/.st
1b510 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71  atic const u8 sq
1b520 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
1b530 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  zes[] = {.      
1b540 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20    /*  0   1   2 
1b550 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36 20    3   4   5   6 
1b560 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20    7   8   9 */  
1b570 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c   ./*   0 */   0,
1b580 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c    1,  2,  3,  4,
1b590 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c    6,  8,  8,  0,
1b5a0 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20    0,./*  10 */  
1b5b0 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
1b5c0 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20   1,  1,  2,  2, 
1b5d0 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a   3,  3,./*  20 *
1b5e0 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20  /   4,  4,  5,  
1b5f0 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20  5,  6,  6,  7,  
1b600 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33  7,  8,  8,./*  3
1b610 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30  0 */   9,  9, 10
1b620 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32  , 10, 11, 11, 12
1b630 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a  , 12, 13, 13,./*
1b640 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c    40 */  14, 14,
1b650 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c   15, 15, 16, 16,
1b660 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c   17, 17, 18, 18,
1b670 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20  ./*  50 */  19, 
1b680 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20  19, 20, 20, 21, 
1b690 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20  21, 22, 22, 23, 
1b6a0 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32  23,./*  60 */  2
1b6b0 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32  4, 24, 25, 25, 2
1b6c0 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32  6, 26, 27, 27, 2
1b6d0 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f  8, 28,./*  70 */
1b6e0 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30    29, 29, 30, 30
1b6f0 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32  , 31, 31, 32, 32
1b700 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30  , 33, 33,./*  80
1b710 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c   */  34, 34, 35,
1b720 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c   35, 36, 36, 37,
1b730 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20   37, 38, 38,./* 
1b740 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20   90 */  39, 39, 
1b750 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20  40, 40, 41, 41, 
1b760 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a  42, 42, 43, 43,.
1b770 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34  /* 100 */  44, 4
1b780 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34  4, 45, 45, 46, 4
1b790 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34  6, 47, 47, 48, 4
1b7a0 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39  8,./* 110 */  49
1b7b0 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31  , 49, 50, 50, 51
1b7c0 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33  , 51, 52, 52, 53
1b7d0 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20  , 53,./* 120 */ 
1b7e0 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c   54, 54, 55, 55,
1b7f0 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a   56, 56, 57, 57.
1b800 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  };../*.** Return
1b810 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
1b820 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
1b830 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
1b840 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
1b850 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
1b860 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1b870 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
1b880 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
1b890 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20  l_type>=128 ){. 
1b8a0 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
1b8b0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
1b8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1b8d0 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  t( serial_type<1
1b8e0 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  2 .            |
1b8f0 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  | sqlite3SmallTy
1b900 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
1b910 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79  ype]==(serial_ty
1b920 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20  pe - 12)/2 );.  
1b930 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1b940 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
1b950 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
1b960 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  .}.u8 sqlite3Vdb
1b970 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79  eOneByteSerialTy
1b980 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f  peLen(u8 serial_
1b990 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  type){.  assert(
1b9a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38   serial_type<128
1b9b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
1b9c0 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
1b9d0 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
1b9e0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77    .}../*.** If w
1b9f0 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
1ba00 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
1ba10 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
1ba20 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
1ba30 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
1ba40 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
1ba50 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
1ba60 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
1ba70 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
1ba80 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
1ba90 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
1baa0 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
1bab0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
1bac0 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
1bad0 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
1bae0 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
1baf0 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
1bb00 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
1bb10 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
1bb20 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
1bb30 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
1bb40 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
1bb50 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
1bb60 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
1bb70 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
1bb80 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
1bb90 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
1bba0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
1bbb0 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
1bbc0 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
1bbd0 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
1bbe0 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
1bbf0 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
1bc00 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
1bc10 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
1bc20 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
1bc30 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
1bc40 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
1bc50 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
1bc60 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
1bc70 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
1bc80 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
1bc90 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
1bca0 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
1bcb0 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
1bcc0 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
1bcd0 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
1bce0 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
1bcf0 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
1bd00 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
1bd10 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
1bd20 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
1bd30 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
1bd40 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
1bd50 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
1bd60 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
1bd70 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
1bd80 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
1bd90 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
1bda0 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
1bdb0 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
1bdc0 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
1bdd0 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
1bde0 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
1bdf0 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
1be00 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
1be10 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
1be20 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
1be30 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
1be40 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
1be50 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
1be60 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
1be70 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
1be80 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
1be90 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
1bea0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1beb0 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
1bec0 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
1bed0 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
1bee0 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
1bef0 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
1bf00 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1bf10 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
1bf20 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
1bf30 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
1bf40 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
1bf50 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
1bf60 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
1bf70 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
1bf80 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
1bf90 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
1bfa0 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
1bfb0 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
1bfc0 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
1bfd0 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
1bfe0 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
1bff0 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
1c000 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
1c010 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
1c020 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
1c030 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
1c040 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
1c050 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
1c060 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
1c070 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
1c080 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
1c090 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
1c0a0 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
1c0b0 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
1c0c0 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
1c0d0 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
1c0e0 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
1c0f0 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
1c100 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
1c110 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
1c120 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
1c130 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
1c140 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1c150 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
1c160 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
1c170 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
1c180 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
1c190 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
1c1a0 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
1c1b0 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
1c1c0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
1c1d0 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
1c1e0 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
1c1f0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1c200 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
1c210 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
1c220 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
1c230 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1c240 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
1c250 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
1c260 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
1c270 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68  ft in buf[].  Th
1c280 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1c290 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61  onsible.** for a
1c2a0 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68  llocating enough
1c2b0 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20   space to buf[] 
1c2c0 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
1c2d0 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73  re field, exclus
1c2e0 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d  ive.** of the pM
1c2f0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65  em->u.nZero byte
1c300 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f  s for a MEM_Zero
1c310 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   value..**.** Re
1c320 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1c330 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1c340 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
1c350 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
1c360 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
1c370 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
1c380 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
1c390 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
1c3a0 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
1c3b0 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
1c3c0 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
1c3d0 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
1c3e0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
1c3f0 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d  u8 *buf, Mem *pM
1c400 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74  em, u32 serial_t
1c410 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b  ype){.  u32 len;
1c420 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
1c430 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
1c440 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
1c450 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
1c460 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
1c470 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66     u32 i;.    if
1c480 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1c490 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c4a0 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
1c4b0 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29  eof(pMem->u.r) )
1c4c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1c4d0 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73  v, &pMem->u.r, s
1c4e0 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
1c4f0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1c500 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
1c510 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
1c520 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
1c530 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
1c540 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
1c550 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
1c560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
1c570 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  0 );.    do{.   
1c580 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75     buf[--i] = (u
1c590 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
1c5a0 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
1c5b0 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20  while( i );.    
1c5c0 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
1c5d0 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
1c5e0 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
1c5f0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
1c600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1c610 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
1c620 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1c630 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30  ?pMem->u.nZero:0
1c640 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
1c650 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
1c660 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1c670 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
1c680 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e      len = pMem->
1c690 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30  n;.    if( len>0
1c6a0 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70   ) memcpy(buf, p
1c6b0 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
1c6c0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
1c6d0 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
1c6e0 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
1c6f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1c700 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20  }../* Input "x" 
1c710 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  is a sequence of
1c720 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63   unsigned charac
1c730 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73  ters that repres
1c740 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64  ent a.** big-end
1c750 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65  ian integer.  Re
1c760 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c  turn the equival
1c770 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67  ent native integ
1c780 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e  er.*/.#define ON
1c790 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  E_BYTE_INT(x)   
1c7a0 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64   ((i8)(x)[0]).#d
1c7b0 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49  efine TWO_BYTE_I
1c7c0 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69  NT(x)    (256*(i
1c7d0 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31  8)((x)[0])|(x)[1
1c7e0 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45  ]).#define THREE
1c7f0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36  _BYTE_INT(x)  (6
1c800 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  5536*(i8)((x)[0]
1c810 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78  )|((x)[1]<<8)|(x
1c820 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[2]).#define FO
1c830 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20  UR_BYTE_UINT(x) 
1c840 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c   (((u32)(x)[0]<<
1c850 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  24)|((x)[1]<<16)
1c860 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
1c870 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [3]).#define FOU
1c880 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31  R_BYTE_INT(x) (1
1c890 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29  6777216*(i8)((x)
1c8a0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  [0])|((x)[1]<<16
1c8b0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
1c8c0 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  )[3])../*.** Des
1c8d0 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
1c8e0 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
1c8f0 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
1c900 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
1c910 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
1c920 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
1c930 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
1c940 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1c950 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
1c960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  s function is im
1c970 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f  plemented as two
1c980 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
1c990 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e  es for performan
1c9a0 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63  ce..** The few c
1c9b0 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72  ases that requir
1c9c0 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
1c9d0 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74  s are broken out
1c9e0 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65   into a separate
1c9f0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  .** routine so t
1ca00 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  hat in most case
1ca10 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  s the overhead o
1ca20 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61  f moving the sta
1ca30 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73  ck pointer.** is
1ca40 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74   avoided..*/ .st
1ca50 61 74 69 63 20 75 33 32 20 73 65 72 69 61 6c 47  atic u32 serialG
1ca60 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
1ca70 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
1ca80 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
1ca90 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
1caa0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
1cab0 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
1cac0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
1cad0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
1cae0 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
1caf0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
1cb00 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
1cb10 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
1cb20 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
1cb30 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1cb40 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20  TE_UINT(buf);.  
1cb50 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54  u32 y = FOUR_BYT
1cb60 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20  E_UINT(buf+4);. 
1cb70 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
1cb80 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
1cb90 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a  ype==6 ){.    /*
1cba0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1cbb0 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75  29851-52272 Valu
1cbc0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1cbd0 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  n 64-bit.    ** 
1cbe0 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1cbf0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1cc00 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
1cc10 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d  4*)&x;.    pMem-
1cc20 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1cc30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1cc40 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1cc50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
1cc60 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37  VIDENCE-OF: R-57
1cc70 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20  343-49114 Value 
1cc80 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1cc90 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34  IEEE 754-2008 64
1cca0 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61  -bit.    ** floa
1ccb0 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ting point numbe
1ccc0 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  r. */.#if !defin
1ccd0 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
1cce0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ccf0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1cd00 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  T).    /* Verify
1cd10 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
1cd20 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
1cd30 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
1cd40 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74   same.    ** byt
1cd50 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
1cd60 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
1cd70 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
1cd80 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20  FLOAT is.    ** 
1cd90 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
1cda0 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
1cdb0 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
1cdc0 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a   are mixed.    *
1cdd0 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f  * endian..    */
1cde0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1cdf0 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
1ce00 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
1ce10 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1ce20 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
1ce30 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d  .0;.    u64 t2 =
1ce40 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78   t1;.    swapMix
1ce50 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
1ce60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1ce70 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
1ce80 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
1ce90 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
1cea0 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
1ceb0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  if.    assert( s
1cec0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
1ced0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
1cee0 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d  ==8 );.    swapM
1cef0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1cf00 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
1cf10 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73  pMem->u.r, &x, s
1cf20 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70  izeof(x));.    p
1cf30 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 49 73 4e  Mem->flags = IsN
1cf40 61 4e 28 78 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  aN(x) ? MEM_Null
1cf50 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
1cf60 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
1cf70 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1cf80 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
1cf90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1cfa0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
1cfb0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
1cfc0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
1cfd0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
1cfe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
1cff0 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
1d000 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
1d010 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
1d020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1d030 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
1d040 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
1d050 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
1d060 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1d070 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a 20 49   case 10: { /* I
1d080 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79  nternal use only
1d090 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69 72 74  : NULL with virt
1d0a0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
1d0b0 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50 44 41           ** UPDA
1d0c0 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66 6c 61  TE no-change fla
1d0d0 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 70  g set */.      p
1d0e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1d0f0 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a  _Null|MEM_Zero;.
1d100 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
1d110 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  0;.      pMem->u
1d120 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20  .nZero = 0;.    
1d130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d140 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
1d150 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
1d160 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
1d170 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75  case 0: {  /* Nu
1d180 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ll */.      /* E
1d190 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
1d1a0 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20  078-09375 Value 
1d1b0 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  is a NULL. */.  
1d1c0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1d1d0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
1d1e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d1f0 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
1d200 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1d210 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36  F: R-44885-25196
1d220 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62   Value is an 8-b
1d230 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
1d240 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  nt.      ** inte
1d250 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1d260 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59  em->u.i = ONE_BY
1d270 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1d280 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1d290 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1d2a0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1d2b0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1d2c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1d2d0 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
1d2e0 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
1d2f0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1d300 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1d310 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c  -49794-35026 Val
1d320 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1d330 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20  an 16-bit.      
1d340 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1d350 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1d360 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1d370 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75   TWO_BYTE_INT(bu
1d380 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1d390 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1d3a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d3b0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1d3c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
1d3d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1d3e0 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1d3f0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1d400 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1d410 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34  E-OF: R-37839-54
1d420 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62  301 Value is a b
1d430 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74  ig-endian 24-bit
1d440 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1d450 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1d460 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1d470 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59  ->u.i = THREE_BY
1d480 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1d490 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1d4a0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1d4b0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1d4c0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1d4d0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
1d4e0 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
1d4f0 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
1d500 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1d510 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1d520 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c  -01849-26079 Val
1d530 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1d540 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20  an 32-bit.      
1d550 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1d560 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1d570 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1d580 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62   FOUR_BYTE_INT(b
1d590 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50  uf);.#ifdef __HP
1d5a0 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f  _cc .      /* Wo
1d5b0 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e  rk around a sign
1d5c0 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69  -extension bug i
1d5d0 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65  n the HP compile
1d5e0 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20  r for HP/UX */. 
1d5f0 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26       if( buf[0]&
1d600 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69  0x80 ) pMem->u.i
1d610 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30   |= 0xffffffff80
1d620 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66  000000LL;.#endif
1d630 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1d640 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1d650 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1d660 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1d670 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
1d680 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1d690 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
1d6a0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1d6b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1d6c0 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34  F: R-50385-09674
1d6d0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1d6e0 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20  endian 48-bit.  
1d6f0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1d700 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1d710 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1d720 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
1d730 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
1d740 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1d750 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1d760 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1d770 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1d780 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1d790 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1d7a0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
1d7b0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
1d7c0 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
1d7d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
1d7e0 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
1d7f0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1d800 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  */.      /* Thes
1d810 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69  e use local vari
1d820 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65  ables, so do the
1d830 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  m in a separate 
1d840 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
1d850 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
1d860 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61   to move the fra
1d870 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  me pointer in th
1d880 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
1d890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65  .      return se
1d8a0 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69  rialGet(buf,seri
1d8b0 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20  al_type,pMem);. 
1d8c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
1d8d0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
1d8e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
1d8f0 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
1d900 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1d910 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36  ENCE-OF: R-12976
1d920 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20  -22893 Value is 
1d930 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a  the integer 0. *
1d940 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1d950 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d  NCE-OF: R-18143-
1d960 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74  12121 Value is t
1d970 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f  he integer 1. */
1d980 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1d990 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
1d9a0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1d9b0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1d9c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1d9d0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1d9e0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1d9f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30  DENCE-OF: R-1460
1da00 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73  6-31564 Value is
1da10 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20   a BLOB that is 
1da20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69  (N-12)/2 bytes i
1da30 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74  n.      ** lengt
1da40 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  h..      ** EVID
1da50 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31  ENCE-OF: R-28401
1da60 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20  -00140 Value is 
1da70 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  a string in the 
1da80 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e  text encoding an
1da90 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33  d.      ** (N-13
1daa0 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  )/2 bytes in len
1dab0 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74  gth. */.      st
1dac0 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
1dad0 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
1dae0 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d  lob|MEM_Ephem, M
1daf0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Str|MEM_Ephem
1db00 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   };.      pMem->
1db10 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
1db20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
1db30 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1db40 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
1db50 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73  >flags = aFlag[s
1db60 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20  erial_type&1];. 
1db70 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d       return pMem
1db80 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ->n;.    }.  }. 
1db90 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a   return 0;.}./*.
1dba0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1dbb0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
1dbc0 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
1dbd0 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
1dbe0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
1dbf0 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
1dc00 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
1dc10 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
1dc20 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
1dc30 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
1dc40 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1dc50 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
1dc60 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
1dc70 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
1dc80 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
1dc90 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
1dca0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1dcb0 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
1dcc0 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
1dcd0 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
1dce0 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
1dcf0 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
1dd00 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
1dd10 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
1dd20 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
1dd30 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
1dd40 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
1dd50 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1dd60 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
1dd70 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
1dd80 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
1dd90 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
1dda0 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
1ddb0 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
1ddc0 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
1ddd0 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
1dde0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1ddf0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
1de00 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
1de10 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
1de20 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
1de30 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
1de40 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
1de50 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
1de60 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
1de70 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1de80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
1de90 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1dea0 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55  record */.){.  U
1deb0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1dec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ded0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1dee0 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1def0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1df20 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
1df30 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d   *p */.  nByte =
1df40 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1df50 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1df60 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1df70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
1df80 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e  ld+1);.  p = (Un
1df90 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
1dfa0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1dfb0 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
1dfc0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21 70  nByte);.  if( !p
1dfd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1dfe0 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
1dff0 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
1e000 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1e010 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
1e020 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1e030 61 53 6f 72 74 46 6c 61 67 73 21 3d 30 20 29 3b  aSortFlags!=0 );
1e040 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
1e050 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
1e060 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
1e070 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31  o->nKeyField + 1
1e080 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1e090 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1e0a0 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
1e0b0 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
1e0c0 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c  in pKey[], popul
1e0d0 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61  ate the .** Unpa
1e0e0 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
1e0f0 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
1e100 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  y the fourth arg
1e110 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a  ument with the.*
1e120 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1e130 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64  e decoded record
1e140 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
1e150 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1e160 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
1e170 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
1e180 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
1e190 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
1e1a0 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
1e1b0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1e1c0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
1e1d0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
1e1e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1e1f0 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
1e200 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1e210 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1e220 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70  d *p      /* Pop
1e230 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
1e240 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
1e250 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  rning. */.){.  c
1e260 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1e270 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1e280 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1e290 2a 29 70 4b 65 79 3b 0a 20 20 75 33 32 20 64 3b  *)pKey;.  u32 d;
1e2a0 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20   .  u32 idx;    
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2c0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1e2d0 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20   aKey[] to read 
1e2e0 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b  from */.  u16 u;
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1e310 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1e320 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  er */.  u32 szHd
1e330 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  r;.  Mem *pMem =
1e340 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e   p->aMem;..  p->
1e350 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
1e360 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1e370 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1e380 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  Mem) );.  idx = 
1e390 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1e3a0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
1e3b0 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a  szHdr;.  u = 0;.
1e3c0 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1e3d0 64 72 20 26 26 20 64 3c 3d 28 75 33 32 29 6e 4b  dr && d<=(u32)nK
1e3e0 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1e3f0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1e400 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1e410 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1e420 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1e430 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1e440 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1e450 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1e460 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1e470 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1e480 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1e490 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1e4a0 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1e4b0 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1e4c0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  alloc = 0;.    p
1e4d0 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20  Mem->z = 0;.    
1e4e0 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1e4f0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1e500 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1e510 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1e520 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1e530 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1e540 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1e550 64 3e 28 75 33 32 29 6e 4b 65 79 20 26 26 20 75  d>(u32)nKey && u
1e560 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e570 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1e580 20 20 2f 2a 20 49 6e 20 61 20 63 6f 72 72 75 70    /* In a corrup
1e590 74 20 72 65 63 6f 72 64 20 65 6e 74 72 79 2c 20  t record entry, 
1e5a0 74 68 65 20 6c 61 73 74 20 70 4d 65 6d 20 6d 69  the last pMem mi
1e5b0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ght have been se
1e5c0 74 20 75 70 20 75 73 69 6e 67 20 0a 20 20 20 20  t up using .    
1e5d0 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
1e5e0 20 6d 65 6d 6f 72 79 2e 20 4f 76 65 72 77 72 69   memory. Overwri
1e5f0 74 65 20 69 74 73 20 76 61 6c 75 65 20 77 69 74  te its value wit
1e600 68 20 4e 55 4c 4c 2c 20 74 6f 20 70 72 65 76 65  h NULL, to preve
1e610 6e 74 0a 20 20 20 20 2a 2a 20 77 61 72 6e 69 6e  nt.    ** warnin
1e620 67 73 20 66 72 6f 6d 20 4d 53 41 4e 2e 20 2a 2f  gs from MSAN. */
1e630 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e640 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d 2d  MemSetNull(pMem-
1e650 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  1);.  }.  assert
1e660 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
1e670 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  KeyField + 1 );.
1e680 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
1e690 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1e6a0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
1e6b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1e6c0 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f  ares two index o
1e6d0 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b  r table record k
1e6e0 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  eys in the same 
1e6f0 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71  way.** as the sq
1e700 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1e710 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65  ompare() routine
1e720 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63  . Unlike VdbeRec
1e730 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a  ordCompare(),.**
1e740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1e750 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20  eserializes and 
1e760 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20  compares values 
1e770 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
1e780 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1e790 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d  t() and sqlite3M
1e7a0 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  emCompare() func
1e7b0 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65  tions. It is use
1e7c0 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  d.** in assert()
1e7d0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
1e7e0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f  nsure that the o
1e7f0 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e  ptimized code in
1e800 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52  .** sqlite3VdbeR
1e810 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
1e820 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77  eturns results w
1e830 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72  ith these two pr
1e840 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20  imitives..**.** 
1e850 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1e860 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
1e870 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76  parison is equiv
1e880 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64  alent to desired
1e890 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72  Result..** Retur
1e8a0 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65  n false if there
1e8b0 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65   is a disagreeme
1e8c0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1e8d0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1e8e0 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
1e8f0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1e900 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1e910 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
1e920 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1e930 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68  *pPKey2, /* Righ
1e940 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  t key */.  int d
1e950 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20  esiredResult    
1e960 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1e970 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b  ect answer */.){
1e980 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1e990 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e9a0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1e9b0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1e9c0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1e9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1e9e0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1e9f0 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
1ea00 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
1ea10 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
1ea20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1ea30 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1ea40 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
1ea50 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
1ea60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ea70 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1ea80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1ea90 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
1eaa0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
1eab0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
1eac0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
1ead0 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65  yInfo;.  if( pKe
1eae0 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72  yInfo->db==0 ) r
1eaf0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e  eturn 1;.  mem1.
1eb00 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1eb10 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
1eb20 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1eb30 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
1eb40 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
1eb50 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
1eb60 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1eb70 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
1eb80 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
1eb90 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1eba0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1ebb0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1ebc0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
1ebd0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
1ebe0 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
1ebf0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
1ec00 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
1ec10 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
1ec20 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
1ec30 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
1ec40 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
1ec50 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
1ec60 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
1ec70 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
1ec80 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
1ec90 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
1eca0 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
1ecb0 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
1ecc0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
1ecd0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
1ece0 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
1ecf0 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
1ed00 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1ed10 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
1ed20 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
1ed30 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
1ed40 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
1ed50 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
1ed60 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
1ed70 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
1ed80 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
1ed90 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
1eda0 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
1edb0 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
1edc0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
1edd0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
1ede0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1edf0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28  , szHdr1);.  if(
1ee00 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20   szHdr1>98307 ) 
1ee10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ee20 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a  RRUPT;.  d1 = sz
1ee30 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
1ee40 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1ee50 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1ee60 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
1ee70 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1ee80 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c  KeyInfo->aSortFl
1ee90 61 67 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ags!=0 );.  asse
1eea0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  rt( pKeyInfo->nK
1eeb0 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  eyField>0 );.  a
1eec0 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1eed0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1eee0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1eef0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
1ef00 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
1ef10 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
1ef20 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
1ef30 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
1ef40 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
1ef50 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
1ef60 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
1ef70 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
1ef80 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1ef90 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
1efa0 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
1efb0 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
1efc0 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
1efd0 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
1efe0 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
1eff0 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
1f000 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
1f010 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1f020 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
1f030 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
1f040 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
1f050 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
1f060 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
1f070 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
1f080 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
1f090 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
1f0a0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
1f0b0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1f0c0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
1f0d0 66 28 20 64 31 2b 28 75 36 34 29 73 65 72 69 61  f( d1+(u64)seria
1f0e0 6c 5f 74 79 70 65 31 2b 32 3e 28 75 36 34 29 6e  l_type1+2>(u64)n
1f0f0 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
1f100 28 75 36 34 29 73 71 6c 69 74 65 33 56 64 62 65  (u64)sqlite3Vdbe
1f110 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1f120 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 36 34  rial_type1)>(u64
1f130 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
1f140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f150 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
1f160 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
1f170 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
1f180 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
1f190 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1f1a0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1f1b0 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
1f1c0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
1f1d0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
1f1e0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1f1f0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1f200 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
1f210 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20  >aMem[i],.      
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f230 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e       pKeyInfo->n
1f240 41 6c 6c 46 69 65 6c 64 3e 69 20 3f 20 70 4b 65  AllField>i ? pKe
1f250 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
1f260 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
1f270 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1f280 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1f290 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1f2a0 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1f2b0 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 4b 65  /.      if( (pKe
1f2c0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61 67  yInfo->aSortFlag
1f2d0 73 5b 69 5d 20 26 20 4b 45 59 49 4e 46 4f 5f 4f  s[i] & KEYINFO_O
1f2e0 52 44 45 52 5f 42 49 47 4e 55 4c 4c 29 0a 20 20  RDER_BIGNULL).  
1f2f0 20 20 20 20 20 26 26 20 28 28 6d 65 6d 31 2e 66       && ((mem1.f
1f300 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
1f310 20 7c 7c 20 28 70 50 4b 65 79 32 2d 3e 61 4d 65   || (pPKey2->aMe
1f320 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  m[i].flags & MEM
1f330 5f 4e 75 6c 6c 29 29 20 0a 20 20 20 20 20 20 29  _Null)) .      )
1f340 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f350 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f360 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1f370 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 20 26 20  aSortFlags[i] & 
1f380 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44 45  KEYINFO_ORDER_DE
1f390 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  SC ){.        rc
1f3a0 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
1f3b0 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
1f3c0 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
1f3d0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
1f3e0 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
1f3f0 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
1f400 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
1f410 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
1f420 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1f430 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
1f440 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1f450 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1f460 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1f470 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1f480 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1f490 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1f4a0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1f4b0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1f4c0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1f4d0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1f4e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1f4f0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
1f500 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1f510 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1f520 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1f530 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1f540 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
1f550 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1f560 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1f570 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1f580 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1f590 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1f5a0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1f5b0 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
1f5c0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1f5d0 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
1f5e0 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
1f5f0 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
1f600 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
1f610 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1f620 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
1f630 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1f640 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1f650 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
1f660 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
1f670 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1f680 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
1f690 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1f6a0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1f6b0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1f6c0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1f6d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1f6e0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1f6f0 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1f700 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1f710 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1f720 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1f730 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1f740 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1f750 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1f760 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1f770 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1f780 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1f790 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
1f7a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e   constraint is n
1f7b0 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74  ot satisfied, it
1f7c0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1f7d0 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64  high-speed.** vd
1f7e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1f7f0 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63  nt() and vdbeRec
1f800 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1f810 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  () routines will
1f820 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  .** not work cor
1f830 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73  rectly.  If this
1f840 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66   assert() ever f
1f850 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c  ires, it probabl
1f860 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  y means.** that 
1f870 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79  the KeyInfo.nKey
1f880 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f  Field or KeyInfo
1f890 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65  .nAllField value
1f8a0 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a  s were computed.
1f8b0 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a  ** incorrectly..
1f8c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
1f8d0 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
1f8e0 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
1f8f0 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
1f900 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
1f910 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74   /* The record t
1f920 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63  o verify */ .  c
1f930 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
1f940 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20  eyInfo       /* 
1f950 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74  Compare size wit
1f960 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a  h this KeyInfo *
1f970 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  /.){.  int nFiel
1f980 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48  d = 0;.  u32 szH
1f990 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20  dr;.  u32 idx;. 
1f9a0 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20   u32 notUsed;.  
1f9b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1f9c0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1f9d0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1f9e0 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43  *)pKey;..  if( C
1f9f0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1fa00 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56  rn;.  idx = getV
1fa10 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1fa20 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr);.  assert( 
1fa30 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
1fa40 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32  ert( szHdr<=(u32
1fa50 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65  )nKey );.  while
1fa60 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20  ( idx<szHdr ){. 
1fa70 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1fa80 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20  int32(aKey+idx, 
1fa90 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46  notUsed);.    nF
1faa0 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73  ield++;.  }.  as
1fab0 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20  sert( nField <= 
1fac0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1fad0 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1fae0 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1faf0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1fb00 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1fb10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1fb20 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1fb30 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1fb40 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1fb50 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1fb60 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1fb70 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1fb80 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1fb90 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1fba0 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1fbb0 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1fbc0 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1fbd0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1fbe0 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1fbf0 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1fc00 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1fc10 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1fc20 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1fc30 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1fc40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1fc50 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1fc60 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1fc70 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1fc80 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1fc90 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1fca0 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1fcd0 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1fce0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1fcf0 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1fd00 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1fd10 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1fd20 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1fd30 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1fd40 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1fd50 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1fd60 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1fd70 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1fd80 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1fd90 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1fda0 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1fdb0 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1fdc0 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1fdd0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1fde0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1fdf0 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31   *v2;.    Mem c1
1fe00 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1fe10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1fe20 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1fe30 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1fe40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1fe50 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1fe60 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1fe70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1fe80 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1fe90 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1fea0 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1feb0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1fec0 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1fed0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1fee0 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1fef0 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1ff00 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1ff10 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32  ll->enc);.    v2
1ff20 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1ff30 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1ff40 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
1ff50 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76  enc);.    if( (v
1ff60 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29  1==0 || v2==0) )
1ff70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 63 45  {.      if( prcE
1ff80 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1ff90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1ffa0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  ;.      rc = 0;.
1ffb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ffc0 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d   rc = pColl->xCm
1ffd0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
1ffe0 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20  c1.n, v1, c2.n, 
1fff0 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  v2);.    }.    s
20000 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
20010 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
20020 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
20030 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
20040 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
20050 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
20060 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e   pBlob is guaran
20070 74 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f  teed to be a Blo
20080 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61  b that is not ma
20090 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d  rked.** with MEM
200a0 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74  _Zero.  Return t
200b0 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20  rue if it could 
200c0 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a  be a zero-blob..
200d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
200e0 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68  AllZero(const ch
200f0 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
20100 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
20110 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
20120 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74    if( z[i] ) ret
20130 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
20140 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
20150 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62  Compare two blob
20160 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
20170 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
20180 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
20190 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74  rst.** is less t
201a0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
201b0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
201c0 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65  he second, respe
201d0 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f  ctively..** If o
201e0 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65  ne blob is a pre
201f0 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72  fix of the other
20200 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74  , then the short
20210 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72  er is the lessor
20220 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e  ..*/.SQLITE_NOIN
20230 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
20240 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
20250 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
20260 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
20270 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d  nt c;.  int n1 =
20280 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e   pB1->n;.  int n
20290 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f  2 = pB2->n;..  /
202a0 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
202b0 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20   to have a Blob 
202c0 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73  value that has s
202d0 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e  ome non-zero con
202e0 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  tent.  ** follow
202f0 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65  ed by zero conte
20300 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e  nt.  But that on
20310 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20  ly comes up for 
20320 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a  Blobs formed.  *
20330 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  * by the OP_Make
20340 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61  Record opcode, a
20350 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65  nd such Blobs ne
20360 76 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69  ver get passed i
20370 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
20380 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f  MemCompare(). */
20390 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d  .  assert( (pB1-
203a0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
203b0 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29  o)==0 || n1==0 )
203c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32  ;.  assert( (pB2
203d0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
203e0 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20  ro)==0 || n2==0 
203f0 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e  );..  if( (pB1->
20400 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73  flags|pB2->flags
20410 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  ) & MEM_Zero ){.
20420 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61      if( pB1->fla
20430 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20  gs & pB2->flags 
20440 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
20450 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e      return pB1->
20460 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75  u.nZero - pB2->u
20470 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73  .nZero;.    }els
20480 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73  e if( pB1->flags
20490 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
204a0 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
204b0 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d  ero(pB2->z, pB2-
204c0 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  >n) ) return -1;
204d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
204e0 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b  1->u.nZero - n2;
204f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20500 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
20510 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29  (pB1->z, pB1->n)
20520 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
20530 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20      return n1 - 
20540 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
20550 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65    }.  }.  c = me
20560 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32  mcmp(pB1->z, pB2
20570 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20  ->z, n1>n2 ? n2 
20580 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29  : n1);.  if( c )
20590 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74   return c;.  ret
205a0 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a  urn n1 - n2;.}..
205b0 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61  /*.** Do a compa
205c0 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20  rison between a 
205d0 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
205e0 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62  teger and a 64-b
205f0 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  it floating-poin
20600 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65  t.** number.  Re
20610 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
20620 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
20630 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69   if the first (i
20640 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  64) is less than
20650 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  ,.** equal to, o
20660 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
20670 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c  he second (doubl
20680 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
20690 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  t sqlite3IntFloa
206a0 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20  tCompare(i64 i, 
206b0 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28  double r){.  if(
206c0 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
206d0 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20  LE_TYPE)>8 ){.  
206e0 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
206f0 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c  E x = (LONGDOUBL
20700 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66  E_TYPE)i;.    if
20710 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( x<r ) return -
20720 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29  1;.    if( x>r )
20730 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
20740 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
20750 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20  e{.    i64 y;.  
20760 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20    double s;.    
20770 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33  if( r<-922337203
20780 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
20790 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66  eturn +1;.    if
207a0 28 20 72 3e 3d 39 32 32 33 33 37 32 30 33 36 38  ( r>=92233720368
207b0 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74  54775808.0 ) ret
207c0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20  urn -1;.    y = 
207d0 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20  (i64)r;.    if( 
207e0 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  i<y ) return -1;
207f0 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 20 72  .    if( i>y ) r
20800 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 73 20  eturn +1;.    s 
20810 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20  = (double)i;.   
20820 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72   if( s<r ) retur
20830 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e  n -1;.    if( s>
20840 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
20850 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
20860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
20870 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e  e the values con
20880 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77  tained by the tw
20890 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20  o memory cells, 
208a0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67  returning.** neg
208b0 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70  ative, zero or p
208c0 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31  ositive if pMem1
208d0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
208e0 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
208f0 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d  ter.** than pMem
20900 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72  2. Sorting order
20910 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74   is NULL's first
20920 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75  , followed by nu
20930 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a  mbers (integers.
20940 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f  ** and reals) so
20950 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79  rted numerically
20960 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65  , followed by te
20970 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68  xt ordered by th
20980 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
20990 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e  equence pColl an
209a0 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73  d finally blob's
209b0 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63   ordered by memc
209c0 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  mp()..**.** Two 
209d0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
209e0 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c  considered equal
209f0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
20a00 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
20a10 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73  3MemCompare(cons
20a20 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f  t Mem *pMem1, co
20a30 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20  nst Mem *pMem2, 
20a40 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
20a50 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c  Coll){.  int f1,
20a60 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
20a70 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31  ned_flags;..  f1
20a80 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b   = pMem1->flags;
20a90 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66  .  f2 = pMem2->f
20aa0 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64  lags;.  combined
20ab0 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a  _flags = f1|f2;.
20ac0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
20ad0 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65  e3VdbeMemIsRowSe
20ae0 74 28 70 4d 65 6d 31 29 20 26 26 20 21 73 71 6c  t(pMem1) && !sql
20af0 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77  ite3VdbeMemIsRow
20b00 53 65 74 28 70 4d 65 6d 32 29 20 29 3b 0a 20 0a  Set(pMem2) );. .
20b10 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
20b20 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  e is NULL, it is
20b30 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f   less than the o
20b40 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61  ther. If both va
20b50 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55  lues.  ** are NU
20b60 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  LL, return 0..  
20b70 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
20b80 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  d_flags&MEM_Null
20b90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
20ba0 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28  f2&MEM_Null) - (
20bb0 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  f1&MEM_Null);.  
20bc0 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74  }..  /* At least
20bd0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
20be0 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62  values is a numb
20bf0 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  er.  */.  if( co
20c00 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45  mbined_flags&(ME
20c10 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d  M_Int|MEM_Real|M
20c20 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20  EM_IntReal) ){. 
20c30 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6f 6d     testcase( com
20c40 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45  bined_flags & ME
20c50 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74 65 73  M_Int );.    tes
20c60 74 63 61 73 65 28 20 63 6f 6d 62 69 6e 65 64 5f  tcase( combined_
20c70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
20c80 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20c90 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
20ca0 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29   & MEM_IntReal )
20cb0 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  ;.    if( (f1 & 
20cc0 66 32 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  f2 & (MEM_Int|ME
20cd0 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30 20 29  M_IntReal))!=0 )
20ce0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20cf0 28 20 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f  ( f1 & f2 & MEM_
20d00 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Int );.      tes
20d10 74 63 61 73 65 28 20 66 31 20 26 20 66 32 20 26  tcase( f1 & f2 &
20d20 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a   MEM_IntReal );.
20d30 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
20d40 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i < pMem2->u.
20d50 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  i ) return -1;. 
20d60 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
20d70 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i > pMem2->u.i
20d80 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
20d90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20da0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20    }.    if( (f1 
20db0 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29  & f2 & MEM_Real)
20dc0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
20dd0 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d   pMem1->u.r < pM
20de0 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
20df0 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
20e00 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65  pMem1->u.r > pMe
20e10 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e  m2->u.r ) return
20e20 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
20e30 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
20e40 66 28 20 28 66 31 26 28 4d 45 4d 5f 49 6e 74 7c  f( (f1&(MEM_Int|
20e50 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30  MEM_IntReal))!=0
20e60 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
20e70 73 65 28 20 66 31 20 26 20 4d 45 4d 5f 49 6e 74  se( f1 & MEM_Int
20e80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
20e90 73 65 28 20 66 31 20 26 20 4d 45 4d 5f 49 6e 74  se( f1 & MEM_Int
20ea0 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Real );.      if
20eb0 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
20ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
20ed0 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46  turn sqlite3IntF
20ee0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
20ef0 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75  1->u.i, pMem2->u
20f00 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
20f10 20 69 66 28 20 28 66 32 26 28 4d 45 4d 5f 49 6e   if( (f2&(MEM_In
20f20 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21  t|MEM_IntReal))!
20f30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
20f40 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70  ( pMem1->u.i < p
20f50 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
20f60 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69  rn -1;.        i
20f70 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
20f80 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
20f90 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  urn +1;.        
20fa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
20fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20fc0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
20fd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
20fe0 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f1&MEM_Real)!=0
20ff0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
21000 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49  2&(MEM_Int|MEM_I
21010 6e 74 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20  ntReal))!=0 ){. 
21020 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21030 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b   f2 & MEM_Int );
21040 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
21050 65 28 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 52  e( f2 & MEM_IntR
21060 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 72  eal );.        r
21070 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e  eturn -sqlite3In
21080 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
21090 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d  em2->u.i, pMem1-
210a0 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
210b0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
210c0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
210d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
210e0 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  +1;.  }..  /* If
210f0 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
21100 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f  string and the o
21110 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20  ther is a blob, 
21120 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65  the string is le
21130 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
21140 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f   are strings, co
21150 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  mpare using the 
21160 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
21170 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
21180 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
21190 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66  EM_Str ){.    if
211a0 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f1 & MEM_Str)
211b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
211c0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
211d0 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53   if( (f2 & MEM_S
211e0 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
211f0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
21200 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ..    assert( pM
21210 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d  em1->enc==pMem2-
21220 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64  >enc || pMem1->d
21230 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21240 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21250 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
21260 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20  E_UTF8 || .     
21270 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e         pMem1->en
21280 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
21290 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  E || pMem1->enc=
212a0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
212b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
212c0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
212d0 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
212e0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
212f0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20   even if.    ** 
21300 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73  the user deletes
21310 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
21320 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68  equence after th
21330 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69  e vdbe program i
21340 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  s.    ** compile
21350 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20  d (this was not 
21360 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29  always the case)
21370 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
21380 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70  ert( !pColl || p
21390 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20  Coll->xCmp );.. 
213a0 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
213b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
213c0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
213d0 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20  g(pMem1, pMem2, 
213e0 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pColl, 0);.    }
213f0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c  .    /* If a NUL
21400 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61  L pointer was pa
21410 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c  ssed as the coll
21420 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61  ate function, fa
21430 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ll through.    *
21440 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61  * to the blob ca
21450 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d  se and use memcm
21460 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20  p().  */.  }. . 
21470 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
21480 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20  must be blobs.  
21490 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65  Compare using me
214a0 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65  mcmp().  */.  re
214b0 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62  turn sqlite3Blob
214c0 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70  Compare(pMem1, p
214d0 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Mem2);.}.../*.**
214e0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
214f0 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
21500 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
21510 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61   serial-type tha
21520 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  t.** corresponds
21530 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   to an integer -
21540 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77   all values betw
21550 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c  een 1 and 9 incl
21560 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74  usive .** except
21570 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70   7. The second p
21580 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
21590 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
215a0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a  integer value.**
215b0 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f   serialized acco
215c0 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f  rding to serial_
215d0 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74  type. This funct
215e0 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
215f0 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20  .** and returns 
21600 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  the value..*/.st
21610 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63  atic i64 vdbeRec
21620 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32  ordDecodeInt(u32
21630 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f   serial_type, co
21640 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
21650 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74   u32 y;.  assert
21660 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
21670 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20  (serial_type>=1 
21680 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  && serial_type<=
21690 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  9 && serial_type
216a0 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68  !=7) );.  switch
216b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
216c0 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
216d0 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74   case 1:.      t
216e0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
216f0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
21700 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49  eturn ONE_BYTE_I
21710 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
21720 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74  se 2:.      test
21730 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
21740 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
21750 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  rn TWO_BYTE_INT(
21760 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
21770 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  3:.      testcas
21780 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
21790 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
217a0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
217b0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34  Key);.    case 4
217c0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
217d0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
217e0 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   );.      y = FO
217f0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
21800 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  y);.      return
21810 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
21820 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21830 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  5: {.      testc
21840 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
21850 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
21860 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  n FOUR_BYTE_UINT
21870 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
21880 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
21890 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
218a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
218b0 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  {.      u64 x = 
218c0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
218d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
218e0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
218f0 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  80 );.      x = 
21900 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
21910 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
21920 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
21930 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i64)*(i64*)&x;. 
21940 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
21950 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  rn (serial_type 
21960 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  - 8);.}../*.** T
21970 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
21980 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
21990 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
219a0 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
219b0 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
219c0 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
219d0 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
219e0 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
219f0 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
21a00 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
21a10 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
21a20 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
21a30 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
21a40 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
21a50 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
21a60 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
21a70 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
21a80 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
21a90 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
21aa0 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
21ab0 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
21ac0 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
21ad0 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
21ae0 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
21af0 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
21b00 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73  rgument bSkip is
21b10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73   non-zero, it is
21b20 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
21b30 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
21b40 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  eady.** determin
21b50 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
21b60 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
21b70 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a  keys are equal..
21b80 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
21b90 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
21ba0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
21bb0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
21bc0 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a  elds. If all .**
21bd0 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70   fields that app
21be0 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73  ear in both keys
21bf0 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
21c00 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
21c10 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  _rc is .** retur
21c20 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  ned..**.** If da
21c30 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
21c40 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c  n is discovered,
21c50 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72   set pPKey2->err
21c60 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49  Code to .** SQLI
21c70 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72  TE_CORRUPT and r
21c80 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f  eturn 0. If an O
21c90 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
21ca0 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b  untered, .** pPK
21cb0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20  ey2->errCode is 
21cc0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
21cd0 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69  MEM and, if it i
21ce0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a  s not NULL, the.
21cf0 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  ** malloc-failed
21d00 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74   flag set on dat
21d10 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50  abase handle (pP
21d20 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
21d30 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  db)..*/.int sqli
21d40 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21d50 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20  pareWithSkip(.  
21d60 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
21d70 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
21d80 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
21d90 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
21da0 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20  *pPKey2,        
21db0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
21dc0 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21de0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
21df0 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
21e00 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
21e10 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
21e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21e30 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
21e40 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
21e50 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
21e60 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
21e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21e80 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
21e90 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
21ea0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
21ed0 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
21ee0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
21ef0 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
21f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
21f10 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
21f20 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
21f30 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
21f60 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
21f70 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
21f80 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
21f90 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
21fa0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
21fb0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
21fc0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
21fd0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
21fe0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
21ff0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
22000 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
22010 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
22020 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
22030 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
22040 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
22050 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
22060 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
22070 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
22080 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
22090 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
220a0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
220b0 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
220c0 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
220d0 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
220e0 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
220f0 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
22100 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
22110 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
22120 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
22130 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
22140 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
22150 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
22160 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
22170 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
22180 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
22190 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
221a0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
221b0 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
221c0 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 20 3d   szHdr1;.    i =
221d0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 31   0;.  }.  if( d1
221e0 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
221f0 20 29 7b 20 0a 20 20 20 20 70 50 4b 65 79 32 2d   ){ .    pPKey2-
22200 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
22210 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22220 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
22230 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
22240 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f   */.  }..  VVA_O
22250 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
22260 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
22270 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
22280 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
22290 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
222a0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
222b0 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  AllField>=pPKey2
222c0 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20  ->nField .      
222d0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
222e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
222f0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
22300 6f 72 74 46 6c 61 67 73 21 3d 30 20 29 3b 0a 20  ortFlags!=0 );. 
22310 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
22320 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  >pKeyInfo->nKeyF
22330 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
22340 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
22350 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
22360 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
22370 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
22380 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
22390 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
223a0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
223b0 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74  (MEM_Int|MEM_Int
223c0 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 74  Real) ){.      t
223d0 65 73 74 63 61 73 65 28 20 70 52 68 73 2d 3e 66  estcase( pRhs->f
223e0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
223f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22400 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
22410 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20  MEM_IntReal );. 
22420 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
22430 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
22440 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22450 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
22460 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
22470 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
22480 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
22490 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
224a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
224b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
224c0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
224d0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
224e0 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =7 ){.        sq
224f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
22500 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
22510 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
22520 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
22530 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
22540 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75  tCompare(pRhs->u
22550 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20  .i, mem1.u.r);. 
22560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22570 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
22580 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
22590 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
225a0 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
225b0 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
225c0 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
225d0 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
225e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
225f0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
22600 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
22610 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
22620 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
22630 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
22640 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
22650 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
22660 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
22670 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
22680 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
22690 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
226a0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
226b0 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =10 ){.        /
226c0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31  * Serial types 1
226d0 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65  2 or greater are
226e0 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
226f0 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e  bs (greater than
22700 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
22710 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61  ers). Types 10 a
22720 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e  nd 11 are curren
22730 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f  tly "reserved fo
22740 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20  r future .      
22750 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74    ** use", so it
22760 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20   doesn't really 
22770 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20  matter what the 
22780 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
22790 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
227a0 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63  them to numberic
227b0 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f   values are.  */
227c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
227d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
227e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
227f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22800 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
22810 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22820 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
22830 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
22840 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
22850 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69          if( seri
22860 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
22870 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
22880 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r<pRhs->u.r )
22890 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
228a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
228b0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e   }else if( mem1.
228c0 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r>pRhs->u.r ){
228d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
228e0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = +1;.          
228f0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
22900 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22910 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
22920 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c  ompare(mem1.u.i,
22930 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20   pRhs->u.r);.   
22940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22950 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
22960 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   is a string */.
22970 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
22980 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  s->flags & MEM_S
22990 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  tr ){.      getV
229a0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
229b0 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
229c0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
229d0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
229e0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
229f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
22a00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22a10 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
22a20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
22a30 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
22a40 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
22a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22a60 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72     mem1.n = (ser
22a70 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
22a80 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
22a90 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
22aa0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
22ab0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
22ac0 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
22ad0 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  .n+1)==(unsigned
22ae0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
22af0 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e    if( (d1+mem1.n
22b00 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
22b10 65 79 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ey1.         || 
22b20 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  (pKeyInfo = pPKe
22b30 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e 6e  y2->pKeyInfo)->n
22b40 41 6c 6c 46 69 65 6c 64 3c 3d 69 0a 20 20 20 20  AllField<=i.    
22b50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
22b60 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
22b70 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
22b80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22bb0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
22bc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
22bd0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pKeyInfo->aCol
22be0 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
22bf0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
22c00 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
22c10 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
22c20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
22c30 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
22c40 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
22c50 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
22c60 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64   (char*)&aKey1[d
22c70 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1];.          rc
22c80 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65   = vdbeCompareMe
22c90 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20  mString(.       
22ca0 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52         &mem1, pR
22cb0 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  hs, pKeyInfo->aC
22cc0 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d  oll[i], &pPKey2-
22cd0 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20  >errCode.       
22ce0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
22cf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
22d00 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
22d10 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
22d20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
22d30 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
22d40 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
22d50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22d60 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
22d70 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
22d80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d90 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
22da0 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
22db0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
22dc0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
22dd0 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73  Blob ){.      as
22de0 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61  sert( (pRhs->fla
22df0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
22e00 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20  0 || pRhs->n==0 
22e10 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  );.      getVari
22e20 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
22e30 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
22e40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22e50 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
22e60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
22e70 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20  rial_type<12 || 
22e80 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
22e90 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
22ea0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
22eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
22ec0 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c  t nStr = (serial
22ed0 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
22ee0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22ef0 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75  e( (d1+nStr)==(u
22f00 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
22f10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22f20 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d  e( (d1+nStr+1)==
22f30 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
22f40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
22f50 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
22f60 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
22f70 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
22f80 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
22f90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22fa0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
22fb0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
22fc0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
22fd0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
22fe0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
22ff0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
23000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
23010 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e   !isAllZero((con
23020 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  st char*)&aKey1[
23030 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20  d1],nStr) ){.   
23040 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
23050 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
23060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
23070 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
23080 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20  u.nZero;.       
23090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
230a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
230b0 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
230c0 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
230d0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
230e0 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
230f0 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
23100 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23110 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
23120 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
23130 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23140 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
23150 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
23160 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
23170 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
23180 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
23190 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
231a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
231b0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
231c0 6e 74 20 73 6f 72 74 46 6c 61 67 73 20 3d 20 70  nt sortFlags = p
231d0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
231e0 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 3b 0a  >aSortFlags[i];.
231f0 20 20 20 20 20 20 69 66 28 20 73 6f 72 74 46 6c        if( sortFl
23200 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ags ){.        i
23210 66 28 20 28 73 6f 72 74 46 6c 61 67 73 20 26 20  f( (sortFlags & 
23220 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 42 49  KEYINFO_ORDER_BI
23230 47 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20  GNULL)==0.      
23240 20 20 20 7c 7c 20 28 28 73 6f 72 74 46 6c 61 67     || ((sortFlag
23250 73 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45  s & KEYINFO_ORDE
23260 52 5f 44 45 53 43 29 0a 20 20 20 20 20 20 20 20  R_DESC).        
23270 20 20 20 21 3d 28 73 65 72 69 61 6c 5f 74 79 70     !=(serial_typ
23280 65 3d 3d 30 20 7c 7c 20 28 70 52 68 73 2d 3e 66  e==0 || (pRhs->f
23290 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 29 29  lags&MEM_Null)))
232a0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
232b0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
232c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
232d0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
232e0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
232f0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
23300 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
23310 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
23320 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
23330 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
23340 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
23350 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23360 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
23370 20 20 20 20 69 66 28 20 69 3d 3d 70 50 4b 65 79      if( i==pPKey
23380 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  2->nField ) brea
23390 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  k;.    pRhs++;. 
233a0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
233b0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
233c0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
233d0 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
233e0 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
233f0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
23400 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
23410 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 64 31  ned)szHdr1 && d1
23420 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  <=(unsigned)nKey
23430 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  1 );..  /* No me
23440 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
23450 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
23460 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
23470 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
23480 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
23490 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
234a0 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
234b0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
234c0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
234d0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
234e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
234f0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a  lease(&mem1).  *
23500 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
23510 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
23520 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
23530 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
23540 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
23550 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
23560 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
23570 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
23580 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
23590 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
235a0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
235b0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
235c0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
235d0 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
235e0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
235f0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
23600 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50  Key1, pPKey2, pP
23610 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
23620 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  ) .       || pPK
23630 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
23640 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
23650 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65    );.  pPKey2->e
23660 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74  qSeen = 1;.  ret
23670 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
23680 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  ult_rc;.}.int sq
23690 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
236a0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
236b0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
236c0 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
236d0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
236e0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
236f0 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2          /* Ri
23700 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
23710 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
23720 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
23730 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
23740 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
23750 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
23760 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
23770 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
23780 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
23790 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
237a0 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
237b0 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
237c0 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
237d0 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
237e0 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
237f0 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
23800 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
23810 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
23820 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
23830 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
23840 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
23850 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
23860 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
23870 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
23880 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
23890 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
238a0 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
238b0 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
238c0 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
238d0 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
238e0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
238f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
23900 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
23910 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
23920 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
23930 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
23940 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
23950 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
23960 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
23970 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
23980 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
23990 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
239a0 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
239b0 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
239c0 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
239d0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
239e0 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
239f0 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b  64 v;.  i64 lhs;
23a00 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
23a10 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
23a20 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
23a30 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
23a40 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
23a50 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
23a60 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
23a70 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
23a80 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
23a90 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
23aa0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
23ab0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
23ac0 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
23ad0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
23ae0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
23af0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23b00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
23b10 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
23b20 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
23b30 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
23b40 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
23b50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
23b60 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
23b70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
23b80 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
23b90 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
23ba0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
23bb0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
23bc0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
23bd0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
23be0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23bf0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
23c00 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
23c10 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
23c20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
23c30 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
23c40 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
23c50 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
23c60 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
23c70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23c80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
23c90 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
23ca0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
23cb0 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
23cc0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
23cd0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
23ce0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
23cf0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
23d00 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
23d10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23d20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
23d30 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
23d40 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
23d50 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
23d60 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
23d70 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
23d80 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
23d90 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
23da0 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
23db0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
23dc0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
23dd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
23de0 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
23df0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
23e00 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
23e10 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
23e20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
23e30 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
23e40 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
23e50 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
23e60 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
23e70 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
23e80 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
23e90 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
23ea0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
23eb0 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
23ec0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
23ed0 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
23ee0 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
23ef0 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
23f00 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
23f10 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
23f20 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
23f30 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
23f40 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
23f50 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
23f60 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
23f70 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
23f80 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
23f90 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
23fa0 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
23fb0 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
23fc0 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
23fd0 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
23fe0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
23ff0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
24000 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
24010 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
24020 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
24030 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
24040 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
24050 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
24060 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79    }..  v = pPKey
24070 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
24080 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20    if( v>lhs ){. 
24090 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
240a0 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r1;.  }else if(
240b0 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v<lhs ){.    re
240c0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
240d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65    }else if( pPKe
240e0 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
240f0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
24100 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
24110 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
24120 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  l. Compare the t
24130 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20  railing .    ** 
24140 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20  fields.  */.    
24150 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
24160 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
24170 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
24180 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
24190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
241a0 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
241b0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
241c0 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20  s are equal and 
241d0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61  there are no tra
241e0 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65  iling.    ** fie
241f0 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65  lds. Return pPKe
24200 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
24210 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
24220 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
24230 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
24240 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
24250 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 1;.  }..  ass
24260 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
24270 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
24280 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
24290 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75  , res) );.  retu
242a0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
242b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
242c0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
242d0 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
242e0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
242f0 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
24300 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
24310 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
24320 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62   string, that (b
24330 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
24340 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f  d.** uses the co
24350 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
24360 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20   BINARY and (c) 
24370 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
24380 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a  -header varint .
24390 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ** at the start 
243a0 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
243b0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
243c0 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  e byte..*/.stati
243d0 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
243e0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20  CompareString(. 
243f0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
24400 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
24410 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
24420 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
24430 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
24440 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
24450 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
24460 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  y1 = (const u8*)
24470 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72  pKey1;.  int ser
24480 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20  ial_type;.  int 
24490 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
244a0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
244b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
244c0 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  );.  vdbeAssertF
244d0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
244e0 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
244f0 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
24500 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69  Info);.  getVari
24510 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
24520 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
24530 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
24540 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  12 ){.    res = 
24550 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20  pPKey2->r1;     
24560 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
24570 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72  ) is a number or
24580 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c   a null */.  }el
24590 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
245a0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20  type & 0x01) ){ 
245b0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
245c0 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28  2->r2;      /* (
245d0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
245e0 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73  a blob */.  }els
245f0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  e{.    int nCmp;
24600 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20  .    int nStr;. 
24610 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61     int szHdr = a
24620 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53  Key1[0];..    nS
24630 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
24640 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69  e-12) / 2;.    i
24650 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72  f( (szHdr + nStr
24660 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ) > nKey1 ){.   
24670 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
24680 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
24690 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
246a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
246b0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
246c0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
246d0 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
246e0 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
246f0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
24700 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
24710 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
24720 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
24730 20 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20    if( res>0 ){. 
24740 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
24750 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
24760 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
24770 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
24780 2d 3e 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->r1;.    }else{
24790 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
247a0 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
247b0 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
247c0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
247d0 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
247e0 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
247f0 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
24800 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
24810 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
24820 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
24830 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
24840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
24850 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
24860 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
24870 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
24880 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
24890 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
248a0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
248b0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
248c0 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
248d0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
248e0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
248f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
24900 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
24910 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
24920 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
24930 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20  ey2, res).      
24940 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
24950 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
24960 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
24970 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
24980 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
24990 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
249a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
249b0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
249c0 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74  Compare() compat
249d0 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ible function.**
249e0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f   suitable for co
249f0 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a  mparing serializ
24a00 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ed records to th
24a10 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
24a20 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  d passed.** as t
24a30 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
24a40 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61  ..*/.RecordCompa
24a50 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  re sqlite3VdbeFi
24a60 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b  ndCompare(Unpack
24a70 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
24a80 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  /* varintRecordC
24a90 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
24aa0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
24ab0 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68  areString() both
24ac0 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61   assume.  ** tha
24ad0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
24ae0 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74  ader varint that
24af0 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
24b00 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63  tart of each rec
24b10 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e  ord.  ** fits in
24b20 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28   a single byte (
24b30 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c  i.e. is 127 or l
24b40 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f  ess). varintReco
24b50 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20  rdCompareInt(). 
24b60 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   ** also assumes
24b70 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
24b80 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62   to overread a b
24b90 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73  uffer by at leas
24ba0 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69  t the .  ** maxi
24bb0 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67  mum possible leg
24bc0 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70  al header size p
24bd0 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63  lus 8 bytes. Bec
24be0 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20  ause there is.  
24bf0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
24c00 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20   be at least 74 
24c10 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79  (but not 136) by
24c20 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66  tes of padding f
24c30 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20  ollowing each.  
24c40 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
24c50 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64   to varintRecord
24c60 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69  CompareInt() thi
24c70 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65  s makes it conve
24c80 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69  nient to.  ** li
24c90 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  mit the size of 
24ca0 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34  the header to 64
24cb0 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20   bytes in cases 
24cc0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
24cd0 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e  field.  ** is an
24ce0 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20   integer..  **. 
24cf0 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20   ** The easiest 
24d00 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  way to enforce t
24d10 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20  his limit is to 
24d20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65  consider only re
24d30 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20  cords with.  ** 
24d40 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73  13 fields or les
24d50 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
24d60 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65  field is an inte
24d70 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ger, the maximum
24d80 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64   legal.  ** head
24d90 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35  er size is (12*5
24da0 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e   + 1 + 1) bytes.
24db0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b    */.  if( p->pK
24dc0 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
24dd0 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  d<=13 ){.    int
24de0 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
24df0 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
24e00 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
24e10 61 53 6f 72 74 46 6c 61 67 73 5b 30 5d 20 29 7b  aSortFlags[0] ){
24e20 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  .      if( p->pK
24e30 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61  eyInfo->aSortFla
24e40 67 73 5b 30 5d 20 26 20 4b 45 59 49 4e 46 4f 5f  gs[0] & KEYINFO_
24e50 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 20 29 7b  ORDER_BIGNULL ){
24e60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24e70 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
24e80 64 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  dCompare;.      
24e90 7d 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  }.      p->r1 = 
24ea0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
24eb0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
24ec0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31        p->r1 = -1
24ed0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
24ee0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
24ef0 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e   (flags & MEM_In
24f00 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
24f10 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
24f20 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  pareInt;.    }. 
24f30 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
24f40 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
24f50 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
24f60 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
24f70 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
24f80 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f   flags & MEM_Blo
24f90 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  b );.    if( (fl
24fa0 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c  ags & (MEM_Real|
24fb0 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d 45 4d 5f  MEM_IntReal|MEM_
24fc0 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
24fd0 3d 30 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 4b  =0.     && p->pK
24fe0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
24ff0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
25000 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
25010 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20   MEM_Str );.    
25020 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
25030 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
25040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
25050 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
25060 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
25070 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
25080 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
25090 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
250a0 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
250b0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
250c0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
250d0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
250e0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
250f0 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
25100 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
25110 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
25120 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
25130 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
25140 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
25150 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
25160 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
25170 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
25180 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
25190 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
251a0 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
251b0 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
251c0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
251d0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
251e0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
251f0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
25200 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
25210 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
25220 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
25230 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
25240 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
25250 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
25260 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
25270 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
25280 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
25290 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
252a0 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
252b0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
252c0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
252d0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
252e0 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
252f0 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
25300 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
25310 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
25320 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
25330 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
25340 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
25350 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
25360 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
25370 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
25380 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
25390 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
253a0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
253b0 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
253c0 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
253d0 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
253e0 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
253f0 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
25400 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
25410 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
25420 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
25430 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
25440 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
25450 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  ;.  assert( (nCe
25460 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
25470 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
25480 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
25490 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
254a0 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
254b0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
254c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
254d0 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
254e0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
254f0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
25500 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
25510 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
25520 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
25540 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
25550 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
25560 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
25570 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
25580 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
25590 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
255a0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
255b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
255c0 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
255d0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3e  testcase( szHdr>
255e0 30 78 37 66 66 66 66 66 66 66 20 29 3b 0a 20 20  0x7fffffff );.  
255f0 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d 30 20 29  assert( m.n>=0 )
25600 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
25610 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73 7a 48 64  (szHdr<3 || szHd
25620 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d 2e 6e 29  r>(unsigned)m.n)
25630 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
25640 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
25650 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
25660 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
25670 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
25680 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
25690 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
256a0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
256b0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
256c0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
256d0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
256e0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
256f0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
25700 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
25710 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
25720 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25730 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
25740 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
25750 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
25760 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
25770 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
25780 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
25790 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
257a0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
257b0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
257c0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
257d0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
257e0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
257f0 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
25800 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
25810 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
25820 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
25830 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
25840 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
25850 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  wid = sqlite3Sma
25860 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65  llTypeSizes[type
25870 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61  Rowid];.  testca
25880 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
25890 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
258a0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
258b0 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
258c0 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
258d0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
258e0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
258f0 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
25900 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
25910 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
25920 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
25930 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
25940 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
25950 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
25960 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
25970 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
25980 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
25990 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
259a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
259b0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
259c0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
259d0 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
259e0 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
259f0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
25a00 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
25a10 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
25a20 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
25a30 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
25a40 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
25a50 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30  e( m.szMalloc!=0
25a60 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
25a70 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
25a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25a90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
25aa0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
25ab0 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
25ac0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
25ad0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
25ae0 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
25af0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
25b00 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
25b10 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
25b20 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
25b30 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
25b40 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
25b50 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
25b60 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
25b70 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
25b80 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
25b90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
25ba0 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
25bb0 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
25bc0 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
25bd0 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
25be0 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
25bf0 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
25c00 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
25c10 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
25c20 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
25c30 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
25c40 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
25c50 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
25c60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
25c70 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
25c80 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
25c90 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
25ca0 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
25cb0 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
25cc0 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
25cd0 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
25ce0 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
25cf0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
25d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
25d10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
25d20 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  n */.  VdbeCurso
25d30 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
25d40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
25d50 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
25d60 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
25d70 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
25d80 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
25d90 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
25da0 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
25db0 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
25de0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
25df0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
25e00 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
25e10 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
25e20 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20  or *pCur;.  Mem 
25e30 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  m;..  assert( pC
25e40 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
25e50 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
25e60 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  Cur = pC->uc.pCu
25e70 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rsor;.  assert( 
25e80 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
25e90 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
25ea0 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20  );.  nCellKey = 
25eb0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
25ec0 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20  oadSize(pCur);. 
25ed0 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
25ee0 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
25ef0 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
25f00 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
25f10 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61  the way.  ** tha
25f20 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
25f30 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
25f40 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
25f50 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
25f60 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
25f70 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
25f80 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
25f90 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
25fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25fb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25fc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
25fd0 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
25fe0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
25ff0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
26000 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
26010 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69  ellKey, &m);.  i
26020 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
26030 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72  urn rc;.  }.  *r
26040 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
26050 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
26060 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  hSkip(m.n, m.z, 
26070 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20  pUnpacked, 0);. 
26080 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
26090 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
260a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
260b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
260c0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
260d0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
260e0 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
260f0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
26100 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
26110 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26120 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
26130 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
26140 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
26150 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
26160 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
26170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26180 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
26190 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
261a0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
261b0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
261c0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
261d0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
261e0 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
261f0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
26200 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
26210 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
26220 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
26230 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
26240 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
26250 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
26260 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
26270 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
26280 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
26290 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
262a0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
262b0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
262c0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
262d0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
262e0 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
262f0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
26300 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
26310 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
26320 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
26330 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
26340 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
26350 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
26360 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
26370 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
26380 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
26390 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
263a0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
263b0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
263c0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
263d0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
263e0 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
263f0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
26400 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a  s obsolete..**.*
26410 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c  * If iCode is 1,
26420 20 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e   then expiration
26430 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
26440 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f  he statement sho
26450 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70  uld.** be reprep
26460 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
26470 67 20 72 65 73 74 61 72 74 65 64 2c 20 62 75 74  g restarted, but
26480 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
26490 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20  y running.** it 
264a0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75  is allowed to ru
264b0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  n to completion.
264c0 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c  .**.** Internall
264d0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
264e0 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 56   just sets the V
264f0 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67  dbe.expired flag
26500 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61   on all.** prepa
26510 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  red statements. 
26520 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65 74   The flag is set
26530 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d   to 1 for an imm
26540 65 64 69 61 74 65 20 65 78 70 69 72 61 74 69 6f  ediate expiratio
26550 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20  n.** and set to 
26560 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72  2 for an advisor
26570 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f  y expiration..*/
26580 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
26590 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
265a0 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
265b0 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20  b, int iCode){. 
265c0 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
265d0 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
265e0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
265f0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
26600 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a  iCode+1;.  }.}..
26610 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26620 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
26630 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
26640 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
26650 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
26660 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
26670 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
26680 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49   Return the SQLI
26690 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73  TE_PREPARE flags
266a0 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a   for a Vdbe..*/.
266b0 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  u8 sqlite3VdbePr
266c0 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65 20  epareFlags(Vdbe 
266d0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
266e0 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f  >prepFlags;.}../
266f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
26700 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
26710 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
26720 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
26730 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
26740 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
26750 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
26760 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
26770 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
26780 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
26790 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
267a0 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
267b0 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
267c0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
267d0 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
267e0 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
267f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
26800 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
26810 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
26820 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
26830 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
26840 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
26850 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
26860 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
26870 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
26880 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
26890 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
268a0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
268b0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
268c0 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
268d0 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61  r[iVar-1];.    a
268e0 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66  ssert( (v->db->f
268f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
26900 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a  ableQPSG)==0 );.
26910 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
26920 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
26930 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
26940 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
26950 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
26960 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
26970 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
26980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26990 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
269a0 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
269b0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
269c0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
269d0 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
269e0 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  UTF8);.      }. 
269f0 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
26a00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26a10 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
26a20 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
26a30 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
26a40 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
26a50 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
26a60 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
26a70 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
26a80 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
26a90 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
26aa0 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
26ab0 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
26ac0 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
26ad0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
26ae0 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
26af0 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
26b00 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
26b10 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
26b20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
26b30 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
26b40 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20  .  if( iVar>=32 
26b50 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
26b60 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b  k |= 0x80000000;
26b70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
26b80 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
26b90 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
26ba0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
26bb0 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  ause a function 
26bc0 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  to throw an erro
26bd0 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c  r if it was call
26be0 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e   from OP_PureFun
26bf0 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  c.** rather than
26c00 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OP_Function..**
26c10 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20  .** OP_PureFunc 
26c20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
26c30 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
26c40 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61  deterministic, a
26c50 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72  nd should.** thr
26c60 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
26c70 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74  t is given input
26c80 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  s that would mak
26c90 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  e it non-determi
26ca0 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20  nistic..** This 
26cb0 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
26cc0 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20  ed by date/time 
26cd0 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
26ce0 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  se non-determini
26cf0 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73  stic.** features
26d00 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a   such as 'now'..
26d10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  */.int sqlite3No
26d20 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65  tPureFunc(sqlite
26d30 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
26d40 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
26d50 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69  ENABLE_STAT4.  i
26d60 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d  f( pCtx->pVdbe==
26d70 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  0 ) return 1;.#e
26d80 6e 64 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d  ndif.  if( pCtx-
26d90 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78  >pVdbe->aOp[pCtx
26da0 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  ->iOp].opcode==O
26db0 50 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a 23 69  P_PureFunc ){.#i
26dc0 66 20 30 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  f 0.    char *zM
26dd0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
26de0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 6e 6f  intf(.       "no
26df0 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
26e00 75 73 65 20 6f 66 20 25 73 28 29 20 69 6e 20 61  use of %s() in a
26e10 6e 20 69 6e 64 65 78 2c 20 43 48 45 43 4b 20 63  n index, CHECK c
26e20 6f 6e 73 74 72 61 69 6e 74 2c 20 22 0a 20 20 20  onstraint, ".   
26e30 20 20 20 20 22 6f 72 20 67 65 6e 65 72 61 74 65      "or generate
26e40 64 20 63 6f 6c 75 6d 6e 22 2c 20 70 43 74 78 2d  d column", pCtx-
26e50 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 29 3b 0a  >pFunc->zName);.
26e60 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
26e70 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a  lt_error(pCtx, z
26e80 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  Msg, -1);.    sq
26e90 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29  lite3_free(zMsg)
26ea0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69  ;.#else.    sqli
26eb0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
26ec0 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 22  (pCtx, .       "
26ed0 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
26ee0 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e  c function in in
26ef0 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  dex expression o
26f00 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  r CHECK constrai
26f10 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b  nt",.       -1);
26f20 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
26f30 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
26f40 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 1;.}..#ifndef
26f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
26f60 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
26f70 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
26f80 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
26f90 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
26fa0 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
26fb0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
26fc0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
26fd0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
26fe0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
26ff0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
27000 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
27010 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
27020 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
27030 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
27040 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
27050 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
27060 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
27070 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
27080 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
27090 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
270a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
270b0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
270c0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
270d0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
270e0 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
270f0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
27100 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
27110 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
27120 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
27130 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
27140 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
27150 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
27160 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
27170 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
27180 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
27190 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
271a0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
271b0 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
271c0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
271d0 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
271e0 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
271f0 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
27200 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
27210 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
27220 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
27230 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
27240 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
27250 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27260 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
27270 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
27280 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
27290 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
272a0 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
272b0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
272c0 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
272d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
272e0 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
272f0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
27300 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52  Field, UnpackedR
27310 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
27320 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
27330 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27340 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
27350 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
27360 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20  &p->aMem[i];.   
27370 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61     if( pMem->zMa
27380 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64  lloc ) sqlite3Vd
27390 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
273a0 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  m);.    }.    sq
273b0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
273c0 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , p);.  }.}.#end
273d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
273e0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
273f0 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OK */..#ifdef SQ
27400 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
27410 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a  PDATE_HOOK./*.**
27420 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
27430 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20  update hook. If 
27440 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
27450 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d  E or DELETE pre-
27460 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20  update call,.** 
27470 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73  then cursor pass
27480 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27490 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
274a0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
274b0 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65  w about.** to be
274c0 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
274d0 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69  ed. If the appli
274e0 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  cation calls sql
274f0 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f  ite3_preupdate_o
27500 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71  ld(),.** the req
27510 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c  uired value will
27520 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
27530 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
27540 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76   points to..*/.v
27550 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
27560 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20  reUpdateHook(.  
27570 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27590 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61  /* Vdbe pre-upda
275a0 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te hook is invok
275b0 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43  ed by */.  VdbeC
275c0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
275d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
275e0 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64  rsor to grab old
275f0 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a  .* values from *
27600 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27620 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
27630 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
27640 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73  DELETE */.  cons
27650 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
27660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27670 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
27680 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276a0 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61    /* Modified ta
276b0 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65  ble */.  i64 iKe
276c0 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y1,             
276d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
276e0 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f  ial key value */
276f0 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
27700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27710 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
27720 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20  or new.* record 
27730 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
27740 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69  *db = v->db;.  i
27750 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55  64 iKey2;.  PreU
27760 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b  pdate preupdate;
27770 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27780 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tbl = pTab->zNam
27790 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  e;.  static cons
277a0 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64  t u8 fakeSortOrd
277b0 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  er = 0;..  asser
277c0 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
277d0 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e==0 );.  memset
277e0 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20  (&preupdate, 0, 
277f0 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65  sizeof(PreUpdate
27800 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77  ));.  if( HasRow
27810 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20  id(pTab)==0 ){. 
27820 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32     iKey1 = iKey2
27830 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64   = 0;.    preupd
27840 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65  ate.pPk = sqlite
27850 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
27860 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
27870 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
27880 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  ITE_UPDATE ){.  
27890 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
278a0 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
278b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
278c0 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey2 = iKey1;. 
278d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
278e0 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64  rt( pCsr->nField
278f0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20  ==pTab->nCol .  
27900 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e       || (pCsr->n
27910 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f  Field==pTab->nCo
27920 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54  l+1 && op==SQLIT
27930 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67  E_DELETE && iReg
27940 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72  ==-1).  );..  pr
27950 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20  eupdate.v = v;. 
27960 20 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20   preupdate.pCsr 
27970 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64  = pCsr;.  preupd
27980 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ate.op = op;.  p
27990 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67  reupdate.iNewReg
279a0 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70   = iReg;.  preup
279b0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20  date.keyinfo.db 
279c0 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74  = db;.  preupdat
279d0 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20  e.keyinfo.enc = 
279e0 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70  ENC(db);.  preup
279f0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
27a00 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  yField = pTab->n
27a10 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
27a20 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 46 6c  .keyinfo.aSortFl
27a30 61 67 73 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  ags = (u8*)&fake
27a40 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
27a50 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
27a60 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
27a70 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
27a80 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61  .  preupdate.pTa
27a90 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d  b = pTab;..  db-
27aa0 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
27ab0 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
27ac0 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
27ad0 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
27ae0 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
27af0 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
27b00 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
27b10 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
27b20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27b30 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
27b40 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
27b50 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
27b60 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
27b70 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75  KeyField+1, preu
27b80 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
27b90 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
27ba0 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
27bb0 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46  te.keyinfo.nKeyF
27bc0 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74  ield+1, preupdat
27bd0 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b  e.pNewUnpacked);
27be0 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65  .  if( preupdate
27bf0 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  .aNew ){.    int
27c00 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
27c10 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b   i<pCsr->nField;
27c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
27c30 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
27c40 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e  se(&preupdate.aN
27c50 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
27c60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
27c70 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  N(db, preupdate.
27c80 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  aNew);.  }.}.#en
27c90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
27ca0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
27cb0 4f 4f 4b 20 2a 2f 0a                             OOK */.