/ Hex Artifact Content
Login

Artifact f00d9b32a250b829a3c00140255a1c37a6463d726bb87ed6bbb80a1ce76a56bd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 23 69 66 64 65   z, n);.}..#ifde
06f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0700: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
0710: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
0720: 74 20 74 6f 20 74 68 65 20 56 64 62 65 2d 3e 70  t to the Vdbe->p
0730: 44 62 6c 53 74 72 20 6c 69 73 74 2e 0a 2a 2f 0a  DblStr list..*/.
0740: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0750: 41 64 64 44 62 6c 71 75 6f 74 65 53 74 72 28 73  AddDblquoteStr(s
0760: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
0770: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
0780: 2a 7a 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *z){.  if( p ){.
0790: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
07a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
07b0: 20 20 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20      DblquoteStr 
07c0: 2a 70 53 74 72 20 3d 20 73 71 6c 69 74 65 33 44  *pStr = sqlite3D
07d0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
07e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
0800: 65 6f 66 28 2a 70 53 74 72 29 2b 6e 2b 31 2d 73  eof(*pStr)+n+1-s
0810: 69 7a 65 6f 66 28 70 53 74 72 2d 3e 7a 29 29 3b  izeof(pStr->z));
0820: 0a 20 20 20 20 69 66 28 20 70 53 74 72 20 29 7b  .    if( pStr ){
0830: 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70 4e 65  .      pStr->pNe
0840: 78 74 53 74 72 20 3d 20 70 2d 3e 70 44 62 6c 53  xtStr = p->pDblS
0850: 74 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 44 62  tr;.      p->pDb
0860: 6c 53 74 72 20 3d 20 70 53 74 72 3b 0a 20 20 20  lStr = pStr;.   
0870: 20 20 20 6d 65 6d 63 70 79 28 70 53 74 72 2d 3e     memcpy(pStr->
0880: 7a 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 20 20  z, z, n+1);.    
0890: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
08a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
08b0: 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 2f  ABLE_NORMALIZE./
08c0: 2a 0a 2a 2a 20 7a 49 64 20 6f 66 20 6c 65 6e 67  *.** zId of leng
08d0: 74 68 20 6e 49 64 20 69 73 20 61 20 64 6f 75 62  th nId is a doub
08e0: 6c 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69  le-quoted identi
08f0: 66 69 65 72 2e 20 20 43 68 65 63 6b 20 74 6f 20  fier.  Check to 
0900: 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74 20 69  see if.** that i
0910: 64 65 6e 74 69 66 69 65 72 20 69 73 20 72 65 61  dentifier is rea
0920: 6c 6c 79 20 75 73 65 64 20 61 73 20 61 20 73 74  lly used as a st
0930: 72 69 6e 67 20 6c 69 74 65 72 61 6c 2e 0a 2a 2f  ring literal..*/
0940: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
0950: 55 73 65 73 44 6f 75 62 6c 65 51 75 6f 74 65 64  UsesDoubleQuoted
0960: 53 74 72 69 6e 67 28 0a 20 20 56 64 62 65 20 2a  String(.  Vdbe *
0970: 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 20 20  pVdbe,          
0980: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
0990: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
09a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
09b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
09c0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 69 64  double-quoted id
09d0: 65 6e 74 69 66 69 65 72 2c 20 61 6c 72 65 61 64  entifier, alread
09e0: 79 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b  y dequoted */.){
09f0: 0a 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20 2a  .  DblquoteStr *
0a00: 70 53 74 72 3b 0a 20 20 61 73 73 65 72 74 28 20  pStr;.  assert( 
0a10: 7a 49 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  zId!=0 );.  if( 
0a20: 70 56 64 62 65 2d 3e 70 44 62 6c 53 74 72 3d 3d  pVdbe->pDblStr==
0a30: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
0a40: 66 6f 72 28 70 53 74 72 3d 70 56 64 62 65 2d 3e  for(pStr=pVdbe->
0a50: 70 44 62 6c 53 74 72 3b 20 70 53 74 72 3b 20 70  pDblStr; pStr; p
0a60: 53 74 72 3d 70 53 74 72 2d 3e 70 4e 65 78 74 53  Str=pStr->pNextS
0a70: 74 72 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  tr){.    if( str
0a80: 63 6d 70 28 7a 49 64 2c 20 70 53 74 72 2d 3e 7a  cmp(zId, pStr->z
0a90: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
0aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
0ab0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
0ac0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0ad0: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0ae0: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0af0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0b00: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0b10: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0b20: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0b30: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0b40: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0b50: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0b60: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
0b70: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
0b80: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
0b90: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
0ba0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
0bb0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
0bc0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0bd0: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0be0: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0bf0: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0c00: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0c10: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0c20: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0c30: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23  ->zSql = zTmp;.#
0c40: 69 66 20 30 0a 20 20 7a 54 6d 70 20 3d 20 70 41  if 0.  zTmp = pA
0c50: 2d 3e 7a 4e 6f 72 6d 53 71 6c 3b 0a 20 20 70 41  ->zNormSql;.  pA
0c60: 2d 3e 7a 4e 6f 72 6d 53 71 6c 20 3d 20 70 42 2d  ->zNormSql = pB-
0c70: 3e 7a 4e 6f 72 6d 53 71 6c 3b 0a 20 20 70 42 2d  >zNormSql;.  pB-
0c80: 3e 7a 4e 6f 72 6d 53 71 6c 20 3d 20 7a 54 6d 70  >zNormSql = zTmp
0c90: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 2d 3e 65  ;.#endif.  pB->e
0ca0: 78 70 6d 61 73 6b 20 3d 20 70 41 2d 3e 65 78 70  xpmask = pA->exp
0cb0: 6d 61 73 6b 3b 0a 20 20 70 42 2d 3e 70 72 65 70  mask;.  pB->prep
0cc0: 46 6c 61 67 73 20 3d 20 70 41 2d 3e 70 72 65 70  Flags = pA->prep
0cd0: 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 63 70 79 28  Flags;.  memcpy(
0ce0: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 2c 20 70 41  pB->aCounter, pA
0cf0: 2d 3e 61 43 6f 75 6e 74 65 72 2c 20 73 69 7a 65  ->aCounter, size
0d00: 6f 66 28 70 42 2d 3e 61 43 6f 75 6e 74 65 72 29  of(pB->aCounter)
0d10: 29 3b 0a 20 20 70 42 2d 3e 61 43 6f 75 6e 74 65  );.  pB->aCounte
0d20: 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  r[SQLITE_STMTSTA
0d30: 54 55 53 5f 52 45 50 52 45 50 41 52 45 5d 2b 2b  TUS_REPREPARE]++
0d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
0d50: 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70 20 61  e the Vdbe.aOp a
0d60: 72 72 61 79 20 73 6f 20 74 68 61 74 20 69 74 20  rray so that it 
0d70: 69 73 20 61 74 20 6c 65 61 73 74 20 6e 4f 70 20  is at least nOp 
0d80: 65 6c 65 6d 65 6e 74 73 20 6c 61 72 67 65 72 20  elements larger 
0d90: 0a 2a 2a 20 74 68 61 6e 20 69 74 73 20 63 75 72  .** than its cur
0da0: 72 65 6e 74 20 73 69 7a 65 2e 20 6e 4f 70 20 69  rent size. nOp i
0db0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
0dc0: 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
0dd0: 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 31 30 32 34  equal.** to 1024
0de0: 2f 73 69 7a 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a  /sizeof(Op)..**.
0df0: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
0e00: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
0e10: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
0e20: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
0e30: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
0e40: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
0e50: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
0e60: 50 61 72 73 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72  Parse.nOpAlloc r
0e70: 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  emain .** unchan
0e80: 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20  ged (this is so 
0e90: 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73  that any opcodes
0ea0: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
0eb0: 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f  ed can be .** co
0ec0: 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61  rrectly dealloca
0ed0: 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
0ee0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56  he rest of the V
0ef0: 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dbe)..*/.static 
0f00: 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28  int growOpArray(
0f10: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6e 4f 70  Vdbe *v, int nOp
0f20: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e 65  ){.  VdbeOp *pNe
0f30: 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  w;.  Parse *p = 
0f40: 76 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a  v->pParse;..  /*
0f50: 20 54 68 65 20 53 51 4c 49 54 45 5f 54 45 53 54   The SQLITE_TEST
0f60: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0f70: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
0f80: 69 6f 6e 20 69 73 20 64 65 73 69 67 6e 65 64 20  ion is designed 
0f90: 74 6f 20 66 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f  to force.  ** mo
0fa0: 72 65 20 66 72 65 71 75 65 6e 74 20 72 65 61 6c  re frequent real
0fb0: 6c 6f 63 73 20 61 6e 64 20 68 65 6e 63 65 20 70  locs and hence p
0fc0: 72 6f 76 69 64 65 20 6d 6f 72 65 20 6f 70 70 6f  rovide more oppo
0fd0: 72 74 75 6e 69 74 69 65 73 20 66 6f 72 20 0a 20  rtunities for . 
0fe0: 20 2a 2a 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f   ** simulated OO
0ff0: 4d 20 66 61 75 6c 74 73 2e 20 20 53 51 4c 49 54  M faults.  SQLIT
1000: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
1010: 54 52 45 53 53 20 69 73 20 67 65 6e 65 72 61 6c  TRESS is general
1020: 6c 79 20 75 73 65 64 0a 20 20 2a 2a 20 64 75 72  ly used.  ** dur
1030: 69 6e 67 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  ing testing only
1040: 2e 20 20 57 69 74 68 20 53 51 4c 49 54 45 5f 54  .  With SQLITE_T
1050: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
1060: 53 53 20 67 72 6f 77 20 74 68 65 20 6f 70 20 61  SS grow the op a
1070: 72 72 61 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  rray.  ** by the
1080: 20 6d 69 6e 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74   minimum* amount
1090: 20 72 65 71 75 69 72 65 64 20 75 6e 74 69 6c 20   required until 
10a0: 74 68 65 20 73 69 7a 65 20 72 65 61 63 68 65 73  the size reaches
10b0: 20 35 31 32 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20   512.  Normal.  
10c0: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 28 77 69  ** operation (wi
10d0: 74 68 6f 75 74 20 53 51 4c 49 54 45 5f 54 45 53  thout SQLITE_TES
10e0: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
10f0: 29 20 69 73 20 74 6f 20 64 6f 75 62 6c 65 20 74  ) is to double t
1100: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
1110: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 20 61  size of the op a
1120: 72 72 61 79 20 6f 72 20 61 64 64 20 31 4b 42 20  rray or add 1KB 
1130: 6f 66 20 73 70 61 63 65 2c 20 77 68 69 63 68 65  of space, whiche
1140: 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 20  ver is smaller. 
1150: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1160: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
1170: 52 45 53 53 0a 20 20 69 6e 74 20 6e 4e 65 77 20  RESS.  int nNew 
1180: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d  = (p->nOpAlloc>=
1190: 35 31 32 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  512 ? p->nOpAllo
11a0: 63 2a 32 20 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  c*2 : p->nOpAllo
11b0: 63 2b 6e 4f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  c+nOp);.#else.  
11c0: 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e  int nNew = (p->n
11d0: 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70  OpAlloc ? p->nOp
11e0: 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28  Alloc*2 : (int)(
11f0: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
1200: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1210: 4d 45 54 45 52 28 6e 4f 70 29 3b 0a 23 65 6e 64  METER(nOp);.#end
1220: 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  if..  /* Ensure 
1230: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
1240: 20 61 20 56 44 42 45 20 64 6f 65 73 20 6e 6f 74   a VDBE does not
1250: 20 67 72 6f 77 20 74 6f 6f 20 6c 61 72 67 65 20   grow too large 
1260: 2a 2f 0a 20 20 69 66 28 20 6e 4e 65 77 20 3e 20  */.  if( nNew > 
1270: 70 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  p->db->aLimit[SQ
1280: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
1290: 4f 50 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  OP] ){.    sqlit
12a0: 65 33 4f 6f 6d 46 61 75 6c 74 28 70 2d 3e 64 62  e3OomFault(p->db
12b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d  .  assert( nOp<=
12e0: 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29  (1024/sizeof(Op)
12f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
1300: 4e 65 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  New>=(p->nOpAllo
1310: 63 2b 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77  c+nOp) );.  pNew
1320: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1330: 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f  loc(p->db, v->aO
1340: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
1350: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
1360: 29 7b 0a 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c  ){.    p->szOpAl
1370: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
1380: 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c  allocSize(p->db,
1390: 20 70 4e 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e   pNew);.    p->n
13a0: 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f  OpAlloc = p->szO
13b0: 70 41 6c 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70  pAlloc/sizeof(Op
13c0: 29 3b 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20  );.    v->aOp = 
13d0: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pNew;.  }.  retu
13e0: 72 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54  rn (pNew ? SQLIT
13f0: 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f  E_OK : SQLITE_NO
1400: 4d 45 4d 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69  MEM_BKPT);.}..#i
1410: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1420: 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  G./* This routin
1430: 65 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76  e is just a conv
1440: 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
1450: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
1460: 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69   that will.** fi
1470: 72 65 20 61 66 74 65 72 20 65 61 63 68 20 6f 70  re after each op
1480: 63 6f 64 65 20 69 73 20 69 6e 73 65 72 74 65 64  code is inserted
1490: 20 61 6e 64 20 64 69 73 70 6c 61 79 65 64 20 75   and displayed u
14a0: 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20  sing.** "PRAGMA 
14b0: 76 64 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d  vdbe_addoptrace=
14c0: 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on"..*/.static v
14d0: 6f 69 64 20 74 65 73 74 5f 61 64 64 6f 70 5f 62  oid test_addop_b
14e0: 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b  reakpoint(void){
14f0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20  .  static int n 
1500: 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65  = 0;.  n++;.}.#e
1510: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ndif../*.** Add 
1520: 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  a new instructio
1530: 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  n to the list of
1540: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75   instructions cu
1550: 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20  rrent in the.** 
1560: 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68  VDBE.  Return th
1570: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1580: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
1590: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
15a0: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20  rs:.**.**    p  
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69               Poi
15c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45  nter to the VDBE
15d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20  .**.**    op    
15e0: 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70            The op
15f0: 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e  code for this in
1600: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20  struction.**.** 
1610: 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20     p1, p2, p3   
1620: 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a     Operands.**.*
1630: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
1640: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1650: 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  l() function to 
1660: 66 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61  fix an address a
1670: 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  nd.** the sqlite
1680: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20  3VdbeChangeP4() 
1690: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e  function to chan
16a0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
16b0: 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e  the P4.** operan
16c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  d..*/.static SQL
16d0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
16e0: 20 67 72 6f 77 4f 70 33 28 56 64 62 65 20 2a 70   growOp3(Vdbe *p
16f0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1700: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
1710: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
1720: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
1730: 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  <=p->nOp );.  if
1740: 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  ( growOpArray(p,
1750: 20 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   1) ) return 1;.
1760: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
1770: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d  rse->nOpAlloc>p-
1780: 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74 75 72 6e  >nOp );.  return
1790: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17a0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
17b0: 2c 20 70 33 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  , p3);.}.int sql
17c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56  ite3VdbeAddOp3(V
17d0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
17e0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
17f0: 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69  int p3){.  int i
1800: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
1810: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ..  i = p->nOp;.
1820: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
1830: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1840: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
1850: 20 6f 70 3e 3d 30 20 26 26 20 6f 70 3c 30 78 66   op>=0 && op<0xf
1860: 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  f );.  if( p->pP
1870: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d  arse->nOpAlloc<=
1880: 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  i ){.    return 
1890: 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70  growOp3(p, op, p
18a0: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a  1, p2, p3);.  }.
18b0: 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f    p->nOp++;.  pO
18c0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
18d0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
18e0: 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70  (u8)op;.  pOp->p
18f0: 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31  5 = 0;.  pOp->p1
1900: 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32   = p1;.  pOp->p2
1910: 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33   = p2;.  pOp->p3
1920: 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34   = p3;.  pOp->p4
1930: 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  .p = 0;.  pOp->p
1940: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
1950: 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ED;.#ifdef SQLIT
1960: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
1970: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d  _COMMENTS.  pOp-
1980: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23  >zComment = 0;.#
1990: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
19a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
19b0: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
19c0: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
19d0: 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  race ){.    sqli
19e0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
19f0: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
1a00: 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70  ;.    test_addop
1a10: 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20  _breakpoint();. 
1a20: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
1a30: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
1a40: 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b  pOp->cycles = 0;
1a50: 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b  .  pOp->cnt = 0;
1a60: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1a70: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
1a80: 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c  AGE.  pOp->iSrcL
1a90: 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ine = 0;.#endif.
1aa0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1ab0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1ac0: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1ad0: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1af0: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1b00: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1b10: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1b20: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1b30: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1b40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1b50: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
1b60: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1b70: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
1b80: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1b90: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
1ba0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1bb0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1bc0: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47   p2, 0);.}../* G
1bd0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1be0: 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1bf0: 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  l jump to instru
1c00: 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69  ction iDest.*/.i
1c10: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  nt sqlite3VdbeGo
1c20: 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  to(Vdbe *p, int 
1c30: 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75 72 6e  iDest){.  return
1c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c50: 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p3(p, OP_Goto, 0
1c60: 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a  , iDest, 0);.}..
1c70: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1c80: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 73 74   to cause the st
1c90: 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62 65 20  ring zStr to be 
1ca0: 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72  loaded into.** r
1cb0: 65 67 69 73 74 65 72 20 69 44 65 73 74 0a 2a 2f  egister iDest.*/
1cc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1cd0: 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62 65 20  LoadString(Vdbe 
1ce0: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63  *p, int iDest, c
1cf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 29  onst char *zStr)
1d00: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1d10: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
1d20: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69  OP_String8, 0, i
1d30: 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30  Dest, 0, zStr, 0
1d40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1d50: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 69  rate code that i
1d60: 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69  nitializes multi
1d70: 70 6c 65 20 72 65 67 69 73 74 65 72 73 20 74 6f  ple registers to
1d80: 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74 65 67   string or integ
1d90: 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  er.** constants.
1da0: 20 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20    The registers 
1db0: 62 65 67 69 6e 20 77 69 74 68 20 69 44 65 73 74  begin with iDest
1dc0: 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 63 6f   and increase co
1dd0: 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20  nsecutively..** 
1de0: 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69 73 20  One register is 
1df0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20  initialized for 
1e00: 65 61 63 68 20 63 68 61 72 61 63 67 74 65 72 20  each characgter 
1e10: 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f  in zTypes[].  Fo
1e20: 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20 63 68  r each.** "s" ch
1e30: 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79 70 65  aracter in zType
1e40: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1e50: 72 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 66  r is a string if
1e60: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
1e70: 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72  .** not NULL, or
1e80: 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20   OP_Null if the 
1e90: 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c 6c 20  value is a null 
1ea0: 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20 65 61  pointer.  For ea
1eb0: 63 68 20 22 69 22 20 63 68 61 72 61 63 74 65 72  ch "i" character
1ec0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c  .** in zTypes[],
1ed0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
1ee0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
1ef0: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  an integer..**.*
1f00: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 73  * If the input s
1f10: 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65  tring does not e
1f20: 6e 64 20 77 69 74 68 20 22 58 22 20 74 68 65 6e  nd with "X" then
1f30: 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77   an OP_ResultRow
1f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
1f50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  is generated for
1f60: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 73 65   the values inse
1f70: 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rted..*/.void sq
1f80: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
1f90: 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ad(Vdbe *p, int 
1fa0: 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  iDest, const cha
1fb0: 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b  r *zTypes, ...){
1fc0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1fd0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63   int i;.  char c
1fe0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1ff0: 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f 72 28   zTypes);.  for(
2000: 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70 65 73  i=0; (c = zTypes
2010: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
2020: 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b     if( c=='s' ){
2030: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2040: 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  r *z = va_arg(ap
2050: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
2060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2070: 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20  eAddOp4(p, z==0 
2080: 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53  ? OP_Null : OP_S
2090: 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74  tring8, 0, iDest
20a0: 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20  +i, 0, z, 0);.  
20b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
20c0: 69 27 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i' ){.      sqli
20d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c  te3VdbeAddOp2(p,
20e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f   OP_Integer, va_
20f0: 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20 69 44  arg(ap, int), iD
2100: 65 73 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  est+i);.    }els
2110: 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b  e{.      goto sk
2120: 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b  ip_op_resultrow;
2130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
2150: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
2160: 69 44 65 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f  iDest, i);.skip_
2170: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20  op_resultrow:.  
2180: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
2190: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
21a0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
21b0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
21c0: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
21d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
21e0: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2200: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
2210: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
2220: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
2230: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
2240: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2260: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
2270: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
2280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2290: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
22a0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
22b0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
22c0: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
22d0: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
22e0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
22f0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
2300: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
2310: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
2320: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
2330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2340: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
2350: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
2360: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2370: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
2380: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
23a0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
23b0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
23c0: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54  ue with a P4_INT
23d0: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c  64 or.** P4_REAL
23e0: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   type..*/.int sq
23f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2400: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  up8(.  Vdbe *p, 
2410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2420: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
2430: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
2440: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2450: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2460: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2480: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2490: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
24a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
24b0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
24c0: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
24d0: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
24e0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  and */.  const u
24f0: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20  8 *zP4,      /* 
2500: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
2510: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
2520: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
2530: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
2540: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20  .  char *p4copy 
2550: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2560: 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56 64  cRawNN(sqlite3Vd
2570: 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69  beDb(p), 8);.  i
2580: 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63  f( p4copy ) memc
2590: 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20  py(p4copy, zP4, 
25a0: 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  8);.  return sql
25b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
25c0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
25d0: 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65  , p4copy, p4type
25e0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
25f0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2600: 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  N./*.** Return t
2610: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2620: 65 20 63 75 72 72 65 6e 74 20 45 58 50 4c 41 49  e current EXPLAI
2630: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 62 61 73  N QUERY PLAN bas
2640: 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61 6e  eline..** 0 mean
2650: 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e 74  s "none"..*/.int
2660: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
2670: 61 69 6e 50 61 72 65 6e 74 28 50 61 72 73 65 20  ainParent(Parse 
2680: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
2690: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70  Op *pOp;.  if( p
26a0: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
26b0: 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  in==0 ) return 0
26c0: 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65  ;.  pOp = sqlite
26d0: 33 56 64 62 65 47 65 74 4f 70 28 70 50 61 72 73  3VdbeGetOp(pPars
26e0: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
26f0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  ->addrExplain);.
2700: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32    return pOp->p2
2710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2720: 20 6e 65 77 20 4f 50 5f 45 78 70 6c 61 69 6e 20   new OP_Explain 
2730: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
2740: 20 74 68 65 20 62 50 75 73 68 20 66 6c 61 67 20   the bPush flag 
2750: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d 61  is true, then ma
2760: 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74  ke this opcode t
2770: 68 65 20 70 61 72 65 6e 74 20 66 6f 72 0a 2a 2a  he parent for.**
2780: 20 73 75 62 73 65 71 75 65 6e 74 20 45 78 70 6c   subsequent Expl
2790: 61 69 6e 73 20 75 6e 74 69 6c 20 73 71 6c 69 74  ains until sqlit
27a0: 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f 70  e3VdbeExplainPop
27b0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  () is called..*/
27c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
27d0: 65 45 78 70 6c 61 69 6e 28 50 61 72 73 65 20 2a  eExplain(Parse *
27e0: 70 50 61 72 73 65 2c 20 75 38 20 62 50 75 73 68  pParse, u8 bPush
27f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2800: 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69 66 28 20  mt, ...){.  if( 
2810: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2820: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
2830: 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62 65 20 2a  zMsg;.    Vdbe *
2840: 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61  v;.    va_list a
2850: 70 3b 0a 20 20 20 20 69 6e 74 20 69 54 68 69 73  p;.    int iThis
2860: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
2870: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 4d  p, zFmt);.    zM
2880: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
2890: 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
28a0: 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20   zFmt, ap);.    
28b0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20  va_end(ap);.    
28c0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
28d0: 65 3b 0a 20 20 20 20 69 54 68 69 73 20 3d 20 76  e;.    iThis = v
28e0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74  ->nOp;.    sqlit
28f0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2900: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 54 68 69  OP_Explain, iThi
2910: 73 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45  s, pParse->addrE
2920: 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20 20 20 20  xplain, 0,.     
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
2950: 43 29 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73  C);.    if( bPus
2960: 68 29 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45  h) pParse->addrE
2970: 78 70 6c 61 69 6e 20 3d 20 69 54 68 69 73 3b 0a  xplain = iThis;.
2980: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70    }.}../*.** Pop
2990: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
29a0: 52 59 20 50 4c 41 4e 20 73 74 61 63 6b 20 6f 6e  RY PLAN stack on
29b0: 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64  e level..*/.void
29c0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
29d0: 61 69 6e 50 6f 70 28 50 61 72 73 65 20 2a 70 50  ainPop(Parse *pP
29e0: 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
29f0: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73  >addrExplain = s
2a00: 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69  qlite3VdbeExplai
2a10: 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65 29 3b  nParent(pParse);
2a20: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2a30: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2a40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61   */../*.** Add a
2a50: 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  n OP_ParseSchema
2a60: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
2a70: 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e  outine is broken
2a80: 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c   out from.** sql
2a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29  ite3VdbeAddOp4()
2aa0: 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20   since it needs 
2ab0: 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f  to also needs to
2ac0: 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73   mark all btrees
2ad0: 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65  .** as having be
2ae0: 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  en used..**.** T
2af0: 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67  he zWhere string
2b00: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
2b10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2b20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
2b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b40: 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73  will take owners
2b50: 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  hip of the alloc
2b60: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
2b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2b80: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
2b90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
2ba0: 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29  b, char *zWhere)
2bb0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71 6c  {.  int j;.  sql
2bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
2bd0: 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
2be0: 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68  , iDb, 0, 0, zWh
2bf0: 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ere, P4_DYNAMIC)
2c00: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
2c10: 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20  ->db->nDb; j++) 
2c20: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
2c30: 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f  tree(p, j);.}../
2c40: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
2c50: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
2c60: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
2c70: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
2c80: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
2c90: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
2ca0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2cb0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
2cc0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
2cd0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2ce0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
2cf0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2d00: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
2d10: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
2d20: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d40: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
2d50: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
2d60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
2d70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2d80: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
2d90: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
2da0: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
2db0: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
2dc0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2dd0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
2de0: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 69 66 28  , p2, p3);.  if(
2df0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
2e00: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 56  iled==0 ){.    V
2e10: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
2e20: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
2e30: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
2e40: 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f 70 2d  _INT32;.    pOp-
2e50: 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20 7d 0a  >p4.i = p4;.  }.
2e60: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2e70: 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20  ../* Insert the 
2e80: 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75 74  end of a co-rout
2e90: 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ine.*/.void sqli
2ea0: 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
2eb0: 69 6e 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ine(Vdbe *v, int
2ec0: 20 72 65 67 59 69 65 6c 64 29 7b 0a 20 20 73 71   regYield){.  sq
2ed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2ee0: 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
2ef0: 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 0a  ne, regYield);..
2f00: 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 74    /* Clear the t
2f10: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
2f20: 72 20 63 61 63 68 65 2c 20 74 68 65 72 65 62 79  r cache, thereby
2f30: 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 65   ensuring that e
2f40: 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75 74  ach.  ** co-rout
2f50: 69 6e 65 20 68 61 73 20 69 74 73 20 6f 77 6e 20  ine has its own 
2f60: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 74 20  independent set 
2f70: 6f 66 20 72 65 67 69 73 74 65 72 73 2c 20 62 65  of registers, be
2f80: 63 61 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e 65  cause co-routine
2f90: 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65 78 70  s.  ** might exp
2fa0: 65 63 74 20 74 68 65 69 72 20 72 65 67 69 73 74  ect their regist
2fb0: 65 72 73 20 74 6f 20 62 65 20 70 72 65 73 65 72  ers to be preser
2fc0: 76 65 64 20 61 63 72 6f 73 73 20 61 6e 20 4f 50  ved across an OP
2fd0: 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a 2a  _Yield, and.  **
2fe0: 20 74 68 61 74 20 63 6f 75 6c 64 20 63 61 75 73   that could caus
2ff0: 65 20 70 72 6f 62 6c 65 6d 73 20 69 66 20 74 77  e problems if tw
3000: 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f 75  o or more co-rou
3010: 74 69 6e 65 73 20 61 72 65 20 75 73 69 6e 67 20  tines are using 
3020: 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74 65  the same.  ** te
3030: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
3040: 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61 72  ..  */.  v->pPar
3050: 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
3060: 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e  ;.  v->pParse->n
3070: 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a  RangeReg = 0;.}.
3080: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3090: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
30a0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
30b0: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
30c0: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
30d0: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
30e0: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
30f0: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
3100: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
3110: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
3120: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
3130: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
3140: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
3150: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
3160: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
3170: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
3180: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
3190: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
31a0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
31b0: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
31c0: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
31d0: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
31e0: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
31f0: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
3200: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
3210: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
3220: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
3230: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
3240: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
3250: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
3260: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
3270: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
3280: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
3290: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
32a0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
32b0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
32c0: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
32d0: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
32e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
32f0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
3300: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
3310: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  bel(Vdbe *v){.  
3320: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
3330: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20  arse;.  int i = 
3340: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
3350: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
3360: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3370: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28   );.  if( (i & (
3380: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i-1))==0 ){.    
3390: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
33a0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
33b0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
33c0: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a               (i*
33f0: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  2+1)*sizeof(p->a
3400: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  Label[0]));.  }.
3410: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
3420: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
3430: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
3440: 72 65 74 75 72 6e 20 41 44 44 52 28 69 29 3b 0a  return ADDR(i);.
3450: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
3460: 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65   label "x" to be
3470: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
3480: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
3490: 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e  tion to.** be in
34a0: 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72  serted.  The par
34b0: 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20  ameter "x" must 
34c0: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
34d0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69  ed from.** a pri
34e0: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
34f0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
3500: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
3510: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
3520: 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  el(Vdbe *v, int 
3530: 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  x){.  Parse *p =
3540: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
3550: 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a 20  t j = ADDR(x);. 
3560: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
3570: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3580: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
3590: 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  j<p->nLabel );. 
35a0: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b   assert( j>=0 );
35b0: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
35c0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
35d0: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
35e0: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
35f0: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
3600: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 72  race ){.      pr
3610: 69 6e 74 66 28 22 52 45 53 4f 4c 56 45 20 4c 41  intf("RESOLVE LA
3620: 42 45 4c 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  BEL %d to %d\n",
3630: 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 20   x, v->nOp);.   
3640: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
3650: 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c 5b  sert( p->aLabel[
3660: 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 4c  j]==(-1) ); /* L
3670: 61 62 65 6c 73 20 6d 61 79 20 6f 6e 6c 79 20 62  abels may only b
3680: 65 20 72 65 73 6f 6c 76 65 64 20 6f 6e 63 65 20  e resolved once 
3690: 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  */.    p->aLabel
36a0: 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20  [j] = v->nOp;.  
36b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
36c0: 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20  the VDBE as one 
36d0: 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65  that can only be
36e0: 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a   run one time..*
36f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3700: 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64  beRunOnlyOnce(Vd
3710: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e  be *p){.  p->run
3720: 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a  OnlyOnce = 1;.}.
3730: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3740: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3750: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3760: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
3770: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3780: 56 64 62 65 52 65 75 73 61 62 6c 65 28 56 64 62  VdbeReusable(Vdb
3790: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f  e *p){.  p->runO
37a0: 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a  nlyOnce = 0;.}..
37b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
37c0: 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73  BUG /* sqlite3As
37d0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c  sertMayAbort() l
37e0: 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ogic */../*.** T
37f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
3800: 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61  e and function a
3810: 72 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  re used to itera
3820: 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  te through all o
3830: 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56  pcodes.** in a V
3840: 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  dbe main program
3850: 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65   and each of the
3860: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74   sub-programs (t
3870: 72 69 67 67 65 72 73 29 20 69 74 20 6d 61 79 20  riggers) it may 
3880: 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63  .** invoke direc
3890: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
38a0: 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  y. It should be 
38b0: 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  used as follows:
38c0: 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70  .**.**   Op *pOp
38d0: 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65  ;.**   VdbeOpIte
38e0: 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20  r sIter;.**.**  
38f0: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
3900: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
3910: 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20  );.**   sIter.v 
3920: 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  = v;            
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3940: 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65 20  // v is of type 
3950: 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c  Vdbe* .**   whil
3960: 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72  e( (pOp = opIter
3970: 4e 65 78 74 28 26 73 49 74 65 72 29 29 20 29 7b  Next(&sIter)) ){
3980: 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f  .**     // Do so
3990: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70  mething with pOp
39a0: 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c  .**   }.**   sql
39b0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
39c0: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
39d0: 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ** .*/.typedef s
39e0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
39f0: 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72   VdbeOpIter;.str
3a00: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b  uct VdbeOpIter {
3a10: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a30: 20 56 64 62 65 20 74 6f 20 69 74 65 72 61 74 65   Vdbe to iterate
3a40: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63   through the opc
3a50: 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62  odes of */.  Sub
3a60: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b  Program **apSub;
3a70: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
3a80: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20   of subprograms 
3a90: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20  */.  int nSub;  
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
3ac0: 72 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f  ries in apSub */
3ad0: 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20  .  int iAddr;   
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3af0: 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
3b00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3b10: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
3b20: 69 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  iSub;           
3b30: 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61         /* 0 = ma
3b40: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20  in program, 1 = 
3b50: 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61  first sub-progra
3b60: 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61  m etc. */.};.sta
3b70: 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65  tic Op *opIterNe
3b80: 78 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70  xt(VdbeOpIter *p
3b90: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
3ba0: 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20  ->v;.  Op *pRet 
3bb0: 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a  = 0;.  Op *aOp;.
3bc0: 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66    int nOp;..  if
3bd0: 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53  ( p->iSub<=p->nS
3be0: 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70  ub ){..    if( p
3bf0: 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20  ->iSub==0 ){.   
3c00: 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b     aOp = v->aOp;
3c10: 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e  .      nOp = v->
3c20: 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nOp;.    }else{.
3c30: 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61        aOp = p->a
3c40: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
3c50: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
3c60: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
3c70: 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub-1]->nOp;.    
3c80: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
3c90: 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20  >iAddr<nOp );.. 
3ca0: 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70     pRet = &aOp[p
3cb0: 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d  ->iAddr];.    p-
3cc0: 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66  >iAddr++;.    if
3cd0: 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20  ( p->iAddr==nOp 
3ce0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62  ){.      p->iSub
3cf0: 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64  ++;.      p->iAd
3d00: 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  dr = 0;.    }.  
3d10: 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70  .    if( pRet->p
3d20: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
3d30: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e  GRAM ){.      in
3d40: 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53  t nByte = (p->nS
3d50: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
3d60: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
3d70: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
3d80: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62  r(j=0; j<p->nSub
3d90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3da0: 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d  if( p->apSub[j]=
3db0: 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72  =pRet->p4.pProgr
3dc0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
3dd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
3de0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20  =p->nSub ){.    
3df0: 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73      p->apSub = s
3e00: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
3e10: 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e  rFree(v->db, p->
3e20: 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20  apSub, nByte);. 
3e30: 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61         if( !p->a
3e40: 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
3e50: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
3e60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3e70: 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d       p->apSub[p-
3e80: 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d  >nSub++] = pRet-
3e90: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
3ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3eb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
3ec0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
3ed0: 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  ** Check if the 
3ee0: 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69  program stored i
3ef0: 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61  n the VM associa
3f00: 74 65 64 20 77 69 74 68 20 70 50 61 72 73 65 20  ted with pParse 
3f10: 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20  may.** throw an 
3f20: 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20  ABORT exception 
3f30: 28 63 61 75 73 69 6e 67 20 74 68 65 20 73 74 61  (causing the sta
3f40: 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  tement, but not 
3f50: 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
3f60: 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c  on.** to be roll
3f70: 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63  ed back). This c
3f80: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
3f90: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   if the main pro
3fa0: 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73  gram or any.** s
3fb0: 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74  ub-programs cont
3fc0: 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20  ains any of the 
3fd0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
3fe0: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69     *  OP_Halt wi
3ff0: 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e  th P1=SQLITE_CON
4000: 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f  STRAINT and P2=O
4010: 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20  E_Abort..**   * 
4020: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77   OP_HaltIfNull w
4030: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
4040: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
4050: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
4060: 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20    OP_Destroy.** 
4070: 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a    *  OP_VUpdate.
4080: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61  **   *  OP_VRena
4090: 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b  me.**   *  OP_Fk
40a0: 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d  Counter with P2=
40b0: 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f  =0 (immediate fo
40c0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
40d0: 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50  aint).**   *  OP
40e0: 5f 43 72 65 61 74 65 42 74 72 65 65 2f 42 54 52  _CreateBtree/BTR
40f0: 45 45 5f 49 4e 54 4b 45 59 20 61 6e 64 20 4f 50  EE_INTKEY and OP
4100: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 0a  _InitCoroutine .
4110: 2a 2a 20 20 20 20 20 20 28 66 6f 72 20 43 52 45  **      (for CRE
4120: 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c  ATE TABLE AS SEL
4130: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
4140: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
4150: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
4160: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
4170: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
4180: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
4190: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
41a0: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
41b0: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
41c0: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
41d0: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
41e0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
41f0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
4200: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
4210: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
4220: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
4230: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
4240: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
4250: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
4260: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
4270: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
4280: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
4290: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
42a0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
42b0: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
42c0: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
42d0: 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ort = 0;.  int h
42e0: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b  asFkCounter = 0;
42f0: 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65  .  int hasCreate
4300: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Table = 0;.  int
4310: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
4320: 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70  e = 0;.  Op *pOp
4330: 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  ;.  VdbeOpIter s
4340: 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Iter;.  memset(&
4350: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
4360: 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65  (sIter));.  sIte
4370: 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c  r.v = v;..  whil
4380: 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72  e( (pOp = opIter
4390: 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30  Next(&sIter))!=0
43a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f   ){.    int opco
43b0: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
43c0: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
43d0: 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20  ==OP_Destroy || 
43e0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
43f0: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
4400: 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c  _VRename .     |
4410: 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  | ((opcode==OP_H
4420: 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  alt || opcode==O
4430: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20  P_HaltIfNull) . 
4440: 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70       && ((pOp->p
4450: 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  1&0xff)==SQLITE_
4460: 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
4470: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29  p->p2==OE_Abort)
4480: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68  ).    ){.      h
4490: 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20  asAbort = 1;.   
44a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
44b0: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
44c0: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 26  OP_CreateBtree &
44d0: 26 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45  & pOp->p3==BTREE
44e0: 5f 49 4e 54 4b 45 59 20 29 20 68 61 73 43 72 65  _INTKEY ) hasCre
44f0: 61 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ateTable = 1;.  
4500: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
4510: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29  _InitCoroutine )
4520: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
4530: 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  e = 1;.#ifndef S
4540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
4550: 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f  GN_KEY.    if( o
4560: 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e  pcode==OP_FkCoun
4570: 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d  ter && pOp->p1==
4580: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 && pOp->p2==1 
4590: 29 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f  ){.      hasFkCo
45a0: 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  unter = 1;.    }
45b0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
45c0: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
45d0: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
45e0: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
45f0: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
4600: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
4610: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
4620: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
4630: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
4640: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
4650: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
4660: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
4670: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
4680: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
4690: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
46a0: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
46b0: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
46c0: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
46d0: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
46e0: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
46f0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
4700: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
4710: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
4720: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
4730: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
4740: 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73  =mayAbort || has
4750: 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  FkCounter.      
4760: 20 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43          || (hasC
4770: 72 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61  reateTable && ha
4780: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20  sInitCoroutine) 
4790: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
47a0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
47b0: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
47c0: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
47d0: 6f 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  on */..#ifdef SQ
47e0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
47f0: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
4800: 57 72 69 74 65 20 63 6f 75 6e 74 65 72 20 69 6e  Write counter in
4810: 20 74 68 65 20 56 44 42 45 20 69 66 20 74 68 65   the VDBE if the
4820: 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 61   cursor is not a
4830: 6e 0a 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 63  n.** ephemeral c
4840: 75 72 73 6f 72 2c 20 6f 72 20 69 66 20 74 68 65  ursor, or if the
4850: 20 63 75 72 73 6f 72 20 61 72 67 75 6d 65 6e 74   cursor argument
4860: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69   is NULL..*/.voi
4870: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63  d sqlite3VdbeInc
4880: 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28 56 64  rWriteCounter(Vd
4890: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
48a0: 72 20 2a 70 43 29 7b 0a 20 20 69 66 28 20 70 43  r *pC){.  if( pC
48b0: 3d 3d 30 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65  ==0.   || (pC->e
48c0: 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45  CurType!=CURTYPE
48d0: 5f 53 4f 52 54 45 52 0a 20 20 20 20 20 20 20 26  _SORTER.       &
48e0: 26 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d  & pC->eCurType!=
48f0: 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 0a 20  CURTYPE_PSEUDO. 
4900: 20 20 20 20 20 20 26 26 20 21 70 43 2d 3e 69 73        && !pC->is
4910: 45 70 68 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a  Ephemeral).  ){.
4920: 20 20 20 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b      p->nWrite++;
4930: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
4940: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4950: 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20  UG./*.** Assert 
4960: 69 66 20 61 6e 20 41 62 6f 72 74 20 61 74 20 74  if an Abort at t
4970: 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  his point in tim
4980: 65 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  e might result i
4990: 6e 20 61 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64  n a corrupt.** d
49a0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
49b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
49c0: 72 74 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65  rtAbortable(Vdbe
49d0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
49e0: 70 2d 3e 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  p->nWrite==0 || 
49f0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
4a00: 61 6c 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  al );.}.#endif..
4a10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4a20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
4a30: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
4a40: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
4a50: 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20  d.  It loops.** 
4a60: 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
4a70: 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65  opcodes and fixe
4a80: 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c  s up some detail
4a90: 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72  s..**.** (1) For
4aa0: 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72   each jump instr
4ab0: 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65  uction with a ne
4ac0: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
4ad0: 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20  (a label).**    
4ae0: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20   resolve the P2 
4af0: 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75  value to an actu
4b00: 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  al address..**.*
4b10: 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68  * (2) Compute th
4b20: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
4b30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73   of arguments us
4b40: 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75  ed by any SQL fu
4b50: 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e  nction.**     an
4b60: 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c  d store that val
4b70: 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41  ue in *pMaxFuncA
4b80: 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55  rgs..**.** (3) U
4b90: 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e 72  pdate the Vdbe.r
4ba0: 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65  eadOnly and Vdbe
4bb0: 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67 73  .bIsReader flags
4bc0: 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a   to accurately.*
4bd0: 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20 77  *     indicate w
4be0: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
4bf0: 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61   statement actua
4c00: 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  lly does..**.** 
4c10: 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  (4) Initialize t
4c20: 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70  he p4.xAdvance p
4c30: 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65  ointer on opcode
4c40: 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a  s that use it..*
4c50: 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d  *.** (5) Reclaim
4c60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
4c70: 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e  cated for storin
4c80: 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20  g labels..**.** 
4c90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
4ca0: 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20  l only function 
4cb0: 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74 68 65  correctly if the
4cc0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67   mkopcodeh.tcl g
4cd0: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69  enerator.** scri
4ce0: 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65 20 6f  pt numbers the o
4cf0: 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74 6c 79  pcodes correctly
4d00: 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20 74 68  .  Changes to th
4d10: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
4d20: 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65  be.** coordinate
4d30: 64 20 77 69 74 68 20 63 68 61 6e 67 65 73 20 74  d with changes t
4d40: 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e  o mkopcodeh.tcl.
4d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4d60: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
4d70: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
4d80: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
4d90: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
4da0: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
4db0: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
4dc0: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
4dd0: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
4de0: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
4df0: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
4e00: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
4e10: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f  Reader = 0;.  pO
4e20: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  p = &p->aOp[p->n
4e30: 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31  Op-1];.  while(1
4e40: 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  ){..    /* Only 
4e50: 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61 6e 64  JUMP opcodes and
4e60: 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73 74 20   the short list 
4e70: 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63 6f 64  of special opcod
4e80: 65 73 20 69 6e 20 74 68 65 20 73 77 69 74 63 68  es in the switch
4e90: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65  .    ** below ne
4ea0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
4eb0: 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f  red.  The mkopco
4ec0: 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f  deh.tcl generato
4ed0: 72 20 73 63 72 69 70 74 20 67 72 6f 75 70 73 0a  r script groups.
4ee0: 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65      ** all these
4ef0: 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74 68 65   opcodes togethe
4f00: 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f 6e 74  r near the front
4f10: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 6c   of the opcode l
4f20: 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a  ist.  Skip.    *
4f30: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74 68 61  * any opcode tha
4f40: 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
4f50: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 76 69  processing by vi
4f60: 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66 61 63  rtual of the fac
4f70: 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 74  t that.    ** it
4f80: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
4f90: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f  SQLITE_MX_JUMP_O
4fa0: 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65 72 66  PCODE, as a perf
4fb0: 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
4fc0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
4fd0: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
4fe0: 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  <=SQLITE_MX_JUMP
4ff0: 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20 20 20  _OPCODE ){.     
5000: 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72   /* NOTE: Be sur
5010: 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70  e to update mkop
5020: 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61  codeh.tcl when a
5030: 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e  dding or removin
5040: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65 73  g.      ** cases
5050: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
5060: 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  h! */.      swit
5070: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
5080: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
5090: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20  OP_Transaction: 
50a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
50b0: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
50c0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
50d0: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
50e0: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20  thru */.        
50f0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
5100: 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20  P_AutoCommit:.  
5110: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
5120: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
5130: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
5140: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
5150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5160: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
5170: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20  _OMIT_WAL.      
5180: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
5190: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
51a0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
51b0: 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63 61 73  uum:.        cas
51c0: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
51d0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  : {.          p-
51e0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
51f0: 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52           p->bIsR
5200: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
5210: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5220: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5230: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
5240: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
5250: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
5260: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
5270: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
5280: 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  reeNext;.       
5290: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
52a0: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
52b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
52c0: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76  de generator nev
52d0: 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20  er codes any of 
52e0: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73  these opcodes as
52f0: 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20   a jump.        
5300: 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e    ** to a label.
5310: 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79    They are alway
5320: 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d  s coded as a jum
5330: 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61  p backwards to a
5340: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b   .          ** k
5350: 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  nown address */.
5360: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5370: 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
5380: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5390: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
53a0: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a     case OP_Prev:
53b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
53c0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
53d0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
53e0: 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 20 20  ious;.          
53f0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5400: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
5410: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
5420: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
5430: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
5440: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5450: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5460: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
5470: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
5480: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
5490: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
54a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
54b0: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
54c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
54d0: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
54e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
54f0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
5500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
5510: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
5520: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
5530: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
5540: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
5550: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
5560: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
5570: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5580: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5590: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
55a0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
55b0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
55c0: 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29  ( (pOp - p->aOp)
55d0: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
55e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
55f0: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
5600: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
5610: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
5620: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
5630: 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d   n>nMaxArgs ) nM
5640: 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20  axArgs = n;.    
5650: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
5660: 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 64  rough into the d
5670: 65 66 61 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20  efault case */. 
5680: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
5690: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
56a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
56b0: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
56c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
56d0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73   mkopcodeh.tcl s
56e0: 63 72 69 70 74 20 68 61 73 20 73 6f 20 61 72 72  cript has so arr
56f0: 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74 68 61  anged things tha
5700: 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20  t the only.     
5710: 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75         ** non-ju
5720: 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20  mp opcodes less 
5730: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
5740: 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61  UMP_CODE are gua
5750: 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20  ranteed to.     
5760: 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e         ** have n
5770: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
5780: 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20  es for P2. */.  
5790: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
57a0: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
57b0: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
57c0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
57d0: 4d 50 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  MP)!=0 );.      
57e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44        assert( AD
57f0: 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72  DR(pOp->p2)<pPar
5800: 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  se->nLabel );.  
5810: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
5820: 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28  2 = aLabel[ADDR(
5830: 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20  pOp->p2)];.     
5840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5860: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5870: 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  /* The mkopcodeh
5880: 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20  .tcl script has 
5890: 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e  so arranged thin
58a0: 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79  gs that the only
58b0: 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75  .      ** non-ju
58c0: 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20  mp opcodes less 
58d0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
58e0: 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61  UMP_CODE are gua
58f0: 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20  ranteed to.     
5900: 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67   ** have non-neg
5910: 61 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72  ative values for
5920: 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73   P2. */.      as
5930: 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70  sert( (sqlite3Op
5940: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70  codeProperty[pOp
5950: 2d 3e 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f  ->opcode]&OPFLG_
5960: 4a 55 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d  JUMP)==0 || pOp-
5970: 3e 70 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  >p2>=0);.    }. 
5980: 20 20 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61     if( pOp==p->a
5990: 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  Op ) break;.    
59a0: 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c  pOp--;.  }.  sql
59b0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
59c0: 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  , pParse->aLabel
59d0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61  );.  pParse->aLa
59e0: 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  bel = 0;.  pPars
59f0: 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->nLabel = 0;. 
5a00: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
5a10: 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73   nMaxArgs;.  ass
5a20: 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
5a30: 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c  r!=0 || DbMaskAl
5a40: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
5a50: 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sk) );.}../*.** 
5a60: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
5a70: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
5a80: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
5a90: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
5aa0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
5ab0: 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70  rentAddr(Vdbe *p
5ac0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5ad0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5ae0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75  C_INIT );.  retu
5af0: 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a  rn p->nOp;.}../*
5b00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
5b10: 61 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64  at least N opcod
5b20: 65 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69  e slots are avai
5b30: 6c 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f  lable in p witho
5b40: 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20  ut.** having to 
5b50: 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20  malloc for more 
5b60: 73 70 61 63 65 20 28 65 78 63 65 70 74 20 77 68  space (except wh
5b70: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e  en compiled usin
5b80: 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  g.** SQLITE_TEST
5b90: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29  _REALLOC_STRESS)
5ba0: 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  .  This interfac
5bb0: 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  e is used during
5bc0: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76   testing.** to v
5bd0: 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74 61  erify that certa
5be0: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  in calls to sqli
5bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
5c00: 28 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20  () can never.** 
5c10: 66 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f  fail due to a OO
5c20: 4d 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63  M fault and henc
5c30: 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
5c40: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  n value from.** 
5c50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c60: 4c 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61  List() will alwa
5c70: 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a  ys be non-NULL..
5c80: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
5c90: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
5ca0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5cb0: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
5cc0: 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  ESS).void sqlite
5cd0: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
5ce0: 6c 6f 63 52 65 71 75 69 72 65 64 28 56 64 62 65  locRequired(Vdbe
5cf0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
5d00: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20  ssert( p->nOp + 
5d10: 4e 20 3c 3d 20 70 2d 3e 70 50 61 72 73 65 2d 3e  N <= p->pParse->
5d20: 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65  nOpAlloc );.}.#e
5d30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69  ndif../*.** Veri
5d40: 66 79 20 74 68 61 74 20 74 68 65 20 56 4d 20 70  fy that the VM p
5d50: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
5d60: 79 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20  y argument does 
5d70: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  not contain.** a
5d80: 6e 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  n OP_ResultRow o
5d90: 70 63 6f 64 65 2e 20 46 61 69 6c 20 61 6e 20 61  pcode. Fail an a
5da0: 73 73 65 72 74 28 29 20 69 66 20 69 74 20 64 6f  ssert() if it do
5db0: 65 73 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  es. This is used
5dc0: 0a 2a 2a 20 62 79 20 63 6f 64 65 20 69 6e 20 70  .** by code in p
5dd0: 72 61 67 6d 61 2e 63 20 74 6f 20 65 6e 73 75 72  ragma.c to ensur
5de0: 65 20 74 68 61 74 20 74 68 65 20 69 6d 70 6c 65  e that the imple
5df0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 63 65 72  mentation of cer
5e00: 74 61 69 6e 0a 2a 2a 20 70 72 61 67 6d 61 73 20  tain.** pragmas 
5e10: 63 6f 6d 70 6f 72 74 73 20 77 69 74 68 20 74 68  comports with th
5e20: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
5e30: 64 20 69 6e 20 74 68 65 20 6d 6b 70 72 61 67 6d  d in the mkpragm
5e40: 61 74 61 62 2e 74 63 6c 0a 2a 2a 20 73 63 72 69  atab.tcl.** scri
5e50: 70 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  pt..*/.#if defin
5e60: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
5e70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5e80: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
5e90: 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71  _STRESS).void sq
5ea0: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
5eb0: 6f 52 65 73 75 6c 74 52 6f 77 28 56 64 62 65 20  oResultRow(Vdbe 
5ec0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
5ed0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
5ee0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  p; i++){.    ass
5ef0: 65 72 74 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  ert( p->aOp[i].o
5f00: 70 63 6f 64 65 21 3d 4f 50 5f 52 65 73 75 6c 74  pcode!=OP_Result
5f10: 52 6f 77 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Row );.  }.}.#en
5f20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
5f30: 61 74 65 20 63 6f 64 65 20 28 61 20 73 69 6e 67  ate code (a sing
5f40: 6c 65 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 20  le OP_Abortable 
5f50: 6f 70 63 6f 64 65 29 20 74 68 61 74 20 77 69 6c  opcode) that wil
5f60: 6c 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 61 74  l.** verify that
5f70: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
5f80: 6d 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  m can safely cal
5f90: 6c 20 41 62 6f 72 74 20 69 6e 20 74 68 65 20 63  l Abort in the c
5fa0: 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 78  urrent.** contex
5fb0: 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  t..*/.#if define
5fc0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5fd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5fe0: 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28  VerifyAbortable(
5ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 6e 45  Vdbe *p, int onE
6000: 72 72 6f 72 29 7b 0a 20 20 69 66 28 20 6f 6e 45  rror){.  if( onE
6010: 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
6020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6030: 70 30 28 70 2c 20 4f 50 5f 41 62 6f 72 74 61 62  p0(p, OP_Abortab
6040: 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  le);.}.#endif../
6050: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6060: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
6070: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
6080: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
6090: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
60a0: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
60b0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
60c0: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
60d0: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
60e0: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
60f0: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
6100: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
6110: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
6120: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
6130: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
6140: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
6150: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
6160: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
6170: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6180: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
6190: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
61a0: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
61b0: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
61c0: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
61d0: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
61e0: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
61f0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
6200: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
6210: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
6220: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
6230: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
6240: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
6250: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
6260: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
6270: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
6280: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
6290: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
62a0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
62b0: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
62c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
62d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
62e0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
62f0: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
6300: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
6310: 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  /.  assert( DbMa
6320: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
6330: 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65  eeMask) );..  re
6340: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
6350: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
6360: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
6370: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
6380: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
6390: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
63a0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
63b0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
63c0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
63d0: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
63e0: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
63f0: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
6400: 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50  **.** Non-zero P
6410: 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a  2 arguments to j
6420: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
6430: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
6440: 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73  ly adjusted.** s
6450: 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  o that the jump 
6460: 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69  target is relati
6470: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
6480: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
6490: 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ed..*/.VdbeOp *s
64a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
64b0: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ist(.  Vdbe *p, 
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64      /* Add opcod
64e0: 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  es to the prepar
64f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
6500: 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20    int nOp,      
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6520: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f  * Number of opco
6530: 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  des to add */.  
6540: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
6550: 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20   *aOp,       /* 
6560: 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  The opcodes to b
6570: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
6580: 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20   iLineno        
6590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
65a0: 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75  rce-file line nu
65b0: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70  mber of first op
65c0: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
65d0: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
65e0: 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61  ut, *pFirst;.  a
65f0: 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a  ssert( nOp>0 );.
6600: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
6610: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
6620: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
6630: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70  nOp + nOp > p->p
6640: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
6650: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
6660: 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65  , nOp) ){.    re
6670: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46  turn 0;.  }.  pF
6680: 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70  irst = pOut = &p
6690: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20  ->aOp[p->nOp];. 
66a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
66b0: 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75   i++, aOp++, pOu
66c0: 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  t++){.    pOut->
66d0: 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70  opcode = aOp->op
66e0: 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  code;.    pOut->
66f0: 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = aOp->p1;.  
6700: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70    pOut->p2 = aOp
6710: 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74  ->p2;.    assert
6720: 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( aOp->p2>=0 );.
6730: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
6740: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61  OpcodeProperty[a
6750: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
6760: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
6770: 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20  aOp->p2>0 ){.   
6780: 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70     pOut->p2 += p
6790: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
67a0: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d   pOut->p3 = aOp-
67b0: 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p3;.    pOut->p
67c0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
67d0: 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  ED;.    pOut->p4
67e0: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  .p = 0;.    pOut
67f0: 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66  ->p5 = 0;.#ifdef
6800: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
6810: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
6820: 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65      pOut->zComme
6830: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
6840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
6850: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70  E_COVERAGE.    p
6860: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
6870: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
6880: 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65  .    (void)iLine
6890: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  no;.#endif.#ifde
68a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
68b0: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
68c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
68d0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
68e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
68f0: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e  PrintOp(0, i+p->
6900: 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70  nOp, &p->aOp[i+p
6910: 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23  ->nOp]);.    }.#
6920: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e  endif.  }.  p->n
6930: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74  Op += nOp;.  ret
6940: 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23  urn pFirst;.}..#
6950: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6960: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
6970: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
6980: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
6990: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
69a0: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
69b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
69c0: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
69d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
69e0: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
69f0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a10: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
6a20: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
6a30: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a50: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
6a60: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
6a70: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
6a80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a90: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
6aa0: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
6ab0: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
6ac0: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
6ad0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6ae0: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
6af0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
6b00: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b20: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
6b30: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
6b40: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6b50: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
6b60: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6b70: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
6b80: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
6b90: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
6ba0: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
6bb0: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
6bc0: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
6bd0: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
6be0: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
6bf0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
6c00: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
6c10: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
6c20: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
6c30: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
6c40: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
6c50: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
6c60: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
6c70: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
6c80: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
6c90: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
6ca0: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
6cb0: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
6cc0: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
6cd0: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
6ce0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
6cf0: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
6d00: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
6d10: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
6d20: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6d30: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  e value of the o
6d40: 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32  pcode, or P1, P2
6d50: 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72  , P3, or P5 oper
6d60: 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70  ands.** for a sp
6d70: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
6d80: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
6d90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
6da0: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32  ode(Vdbe *p, u32
6db0: 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70   addr, u8 iNewOp
6dc0: 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  code){.  sqlite3
6dd0: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
6de0: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77  )->opcode = iNew
6df0: 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73  Opcode;.}.void s
6e00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6e10: 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P1(Vdbe *p, u32 
6e20: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
6e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
6e40: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d  Op(p,addr)->p1 =
6e50: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
6e60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
6e70: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
6e80: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
6e90: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
6ea0: 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76  (p,addr)->p2 = v
6eb0: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
6ec0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
6ed0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
6ee0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
6ef0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
6f00: 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c  ,addr)->p3 = val
6f10: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
6f20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
6f30: 65 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20  e *p, u16 p5){. 
6f40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
6f50: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
6f60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
6f70: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e  ( p->nOp>0 ) p->
6f80: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
6f90: 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = p5;.}../*.** 
6fa0: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
6fb0: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
6fc0: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
6fd0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
6fe0: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
6ff0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
7000: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
7010: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7020: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
7030: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
7040: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
7050: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
7060: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
7070: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
7080: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
7090: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
70a0: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
70b0: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
70c0: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
70d0: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
70e0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
70f0: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
7100: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
7110: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
7120: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44  pDef){.  if( (pD
7130: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
7140: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
7150: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
7160: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
7170: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
7180: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
7190: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
71a0: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
71b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
71c0: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
71d0: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
71e0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
71f0: 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65  NE void freeP4Me
7200: 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d  m(sqlite3 *db, M
7210: 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
7220: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
7230: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7240: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c  >zMalloc);.  sql
7250: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
7260: 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51   p);.}.static SQ
7270: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
7280: 69 64 20 66 72 65 65 50 34 46 75 6e 63 43 74 78  id freeP4FuncCtx
7290: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71  (sqlite3 *db, sq
72a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
72b0: 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72  ){.  freeEphemer
72c0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  alFunction(db, p
72d0: 2d 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74  ->pFunc);. sqlit
72e0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
72f0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
7300: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
7310: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
7320: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73   void *p4){.  as
7330: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77  sert( db );.  sw
7340: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
7350: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
7360: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65  CTX: {.      fre
7370: 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28  eP4FuncCtx(db, (
7380: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7390: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
73a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
73b0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63  e P4_REAL:.    c
73c0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
73d0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
73e0: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44  C:.    case P4_D
73f0: 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65  YNBLOB:.    case
7400: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
7410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7420: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
7430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7440: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
7450: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NFO: {.      if(
7460: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7470: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65  d==0 ) sqlite3Ke
7480: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49  yInfoUnref((KeyI
7490: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  nfo*)p4);.      
74a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
74b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
74c0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
74d0: 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a     case P4_EXPR:
74e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
74f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28  ExprDelete(db, (
7500: 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20  Expr*)p4);.     
7510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7520: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
7530: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
7540: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
7550: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e  unction(db, (Fun
7560: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20  cDef*)p4);.     
7570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7580: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
7590: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70  .      if( db->p
75a0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
75b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
75c0: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
75d0: 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a  te3_value*)p4);.
75e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
75f0: 20 20 20 20 20 66 72 65 65 50 34 4d 65 6d 28 64       freeP4Mem(d
7600: 62 2c 20 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20  b, (Mem*)p4);.  
7610: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7630: 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20  e P4_VTAB : {.  
7640: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
7650: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
7660: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
7670: 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20  (VTable *)p4);. 
7680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7690: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
76a0: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
76b0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
76c0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
76d0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
76e0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
76f0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
7700: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
7710: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
7720: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
7730: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
7740: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
7750: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
7760: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
7770: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
7780: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
7790: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
77a0: 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b  pOp=&aOp[nOp-1];
77b0: 20 70 4f 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d   pOp>=aOp; pOp--
77c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
77d0: 2d 3e 70 34 74 79 70 65 20 3c 3d 20 50 34 5f 46  ->p4type <= P4_F
77e0: 52 45 45 5f 49 46 5f 4c 45 20 29 20 66 72 65 65  REE_IF_LE ) free
77f0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
7800: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
7810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7820: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
7830: 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69  MENTS.      sqli
7840: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
7850: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
7860: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
7870: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7880: 65 4e 4e 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20  eNN(db, aOp);.  
7890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  }.}../*.** Link 
78a0: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
78b0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
78c0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
78d0: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
78e0: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
78f0: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
7900: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
7910: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
7920: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
7930: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
7940: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
7950: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
7960: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
7970: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
7980: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
7990: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
79a0: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
79b0: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
79c0: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
79d0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
79e0: 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64  he opcode at add
79f0: 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a  r into OP_Noop.*
7a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7a10: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
7a20: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
7a30: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  {.  VdbeOp *pOp;
7a40: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
7a50: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
7a60: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
7a70: 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72   addr>=0 && addr
7a80: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70  <p->nOp );.  pOp
7a90: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
7aa0: 3b 0a 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62  ;.  freeP4(p->db
7ab0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
7ac0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
7ad0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
7ae0: 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34  TUSED;.  pOp->p4
7af0: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f  .z = 0;.  pOp->o
7b00: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
7b10: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
7b20: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
7b30: 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22  t opcode is "op"
7b40: 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61   and it is not a
7b50: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
7b60: 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  n,.** then remov
7b70: 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72  e it.  Return tr
7b80: 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ue if and only i
7b90: 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20  f an opcode was 
7ba0: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
7bb0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
7bc0: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62  ePriorOpcode(Vdb
7bd0: 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20  e *p, u8 op){.  
7be0: 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20  if( p->nOp>0 && 
7bf0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
7c00: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20  .opcode==op ){. 
7c10: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7c20: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
7c30: 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a  p(p, p->nOp-1);.
7c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
7c50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
7c60: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
7c70: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
7c80: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
7c90: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
7ca0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
7cb0: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
7cc0: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
7cd0: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
7ce0: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
7cf0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
7d00: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
7d10: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
7d20: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
7d30: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
7d40: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
7d50: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
7d60: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
7d70: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
7d80: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
7d90: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
7da0: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
7db0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
7dc0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
7dd0: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
7de0: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
7df0: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
7e00: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
7e10: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
7e20: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
7e30: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
7e40: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
7e50: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
7e60: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
7e70: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
7e80: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
7e90: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
7ea0: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
7eb0: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
7ec0: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
7ed0: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
7ee0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
7ef0: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
7f00: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
7f10: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
7f20: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
7f30: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
7f40: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
7f50: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
7f60: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  truction..*/.sta
7f70: 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  tic void SQLITE_
7f80: 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61  NOINLINE vdbeCha
7f90: 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62  ngeP4Full(.  Vdb
7fa0: 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c  e *p,.  Op *pOp,
7fb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7fc0: 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20  P4,.  int n.){. 
7fd0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
7fe0: 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70   ){.    freeP4(p
7ff0: 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  ->db, pOp->p4typ
8000: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
8010: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
8020: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   0;.    pOp->p4.
8030: 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
8040: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   n<0 ){.    sqli
8050: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
8060: 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70  p, (int)(pOp - p
8070: 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b  ->aOp), zP4, n);
8080: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
8090: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
80a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
80b0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
80c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
80d0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
80e0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
80f0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
8100: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
8110: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
8120: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
8130: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
8140: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
8150: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
8160: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
8170: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
8180: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
8190: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
81a0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
81b0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d  assert( p->aOp!=
81c0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
81d0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64  ailed );.  if( d
81e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
81f0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34  ){.    if( n!=P4
8200: 5f 56 54 41 42 20 29 20 66 72 65 65 50 34 28 64  _VTAB ) freeP4(d
8210: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
8220: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
8230: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
8240: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
8250: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
8260: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
8270: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
8280: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
8290: 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  1;.  }.  pOp = &
82a0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
82b0: 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d  if( n>=0 || pOp-
82c0: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76  >p4type ){.    v
82d0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
82e0: 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b  p, pOp, zP4, n);
82f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8300: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
8310: 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  32 ){.    /* Not
8320: 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20  e: this cast is 
8330: 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68  safe, because th
8340: 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f  e origin data po
8350: 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20  int was an int. 
8360: 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63     ** that was c
8370: 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20  ast to a (const 
8380: 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20  char *). */.    
8390: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49  pOp->p4.i = SQLI
83a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50  TE_PTR_TO_INT(zP
83b0: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  4);.    pOp->p4t
83c0: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
83d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21    }else if( zP4!
83e0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
83f0: 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70  ( n<0 );.    pOp
8400: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
8410: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
8420: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
8430: 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e  har)n;.    if( n
8440: 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69  ==P4_VTAB ) sqli
8450: 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61  te3VtabLock((VTa
8460: 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d  ble*)zP4);.  }.}
8470: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
8480: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66  he P4 operand of
8490: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
84a0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
84b0: 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20  tion .** to the 
84c0: 76 61 6c 75 65 20 64 65 66 69 6e 65 64 20 62 79  value defined by
84d0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 20   the arguments. 
84e0: 20 54 68 69 73 20 69 73 20 61 20 68 69 67 68 2d   This is a high-
84f0: 73 70 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e  speed.** version
8500: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 43   of sqlite3VdbeC
8510: 68 61 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a  hangeP4()..**.**
8520: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
8530: 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65  must not have be
8540: 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
8550: 66 69 6e 65 64 2e 20 20 41 6e 64 20 74 68 65 20  fined.  And the 
8560: 6e 65 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e  new.** P4 must n
8570: 6f 74 20 62 65 20 50 34 5f 49 4e 54 33 32 2e 20  ot be P4_INT32. 
8580: 20 55 73 65 20 73 71 6c 69 74 65 33 56 64 62 65   Use sqlite3Vdbe
8590: 43 68 61 6e 67 65 50 34 28 29 20 69 6e 20 65 69  ChangeP4() in ei
85a0: 74 68 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65  ther of.** those
85b0: 20 63 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   cases..*/.void 
85c0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
85d0: 64 50 34 28 56 64 62 65 20 2a 70 2c 20 76 6f 69  dP4(Vdbe *p, voi
85e0: 64 20 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  d *pP4, int n){.
85f0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
8600: 20 61 73 73 65 72 74 28 20 6e 21 3d 50 34 5f 49   assert( n!=P4_I
8610: 4e 54 33 32 20 26 26 20 6e 21 3d 50 34 5f 56 54  NT32 && n!=P4_VT
8620: 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AB );.  assert( 
8630: 6e 3c 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  n<=0 );.  if( p-
8640: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8650: 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28  d ){.    freeP4(
8660: 70 2d 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a  p->db, n, pP4);.
8670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
8680: 65 72 74 28 20 70 50 34 21 3d 30 20 29 3b 0a 20  ert( pP4!=0 );. 
8690: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
86a0: 70 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d  p>0 );.    pOp =
86b0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
86c0: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
86d0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
86e0: 4e 4f 54 55 53 45 44 20 29 3b 0a 20 20 20 20 70  NOTUSED );.    p
86f0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a  Op->p4type = n;.
8700: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
8710: 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pP4;.  }.}../*.*
8720: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
8730: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
8740: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
8750: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
8760: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
8770: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
8780: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
8790: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
87a0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
87b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
87c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
87d0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
87e0: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  o;.  assert( v!=
87f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8800: 49 64 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79  Idx!=0 );.  pKey
8810: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
8820: 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
8830: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 69 66  rse, pIdx);.  if
8840: 28 20 70 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c  ( pKeyInfo ) sql
8850: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
8860: 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34  (v, pKeyInfo, P4
8870: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69  _KEYINFO);.}..#i
8880: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8890: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
88a0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  NTS./*.** Change
88b0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
88c0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
88d0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
88e0: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
88f0: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
8900: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
8910: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
8920: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
8930: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
8940: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
8950: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
8960: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
8970: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
8980: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
8990: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
89a0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
89b0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
89c0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
89d0: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
89e0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
89f0: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
8a00: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
8a10: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
8a20: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
8a30: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
8a40: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
8a50: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
8a60: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
8a70: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8a80: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
8a90: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
8aa0: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
8ab0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
8ac0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
8ad0: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
8ae0: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
8af0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
8b00: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
8b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
8b20: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
8b30: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
8b40: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
8b50: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
8b60: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
8b70: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
8b80: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
8b90: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
8ba0: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
8bb0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8bc0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
8bd0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
8be0: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
8bf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8c00: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
8c10: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
8c20: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
8c30: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
8c40: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
8c50: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
8c60: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
8c70: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
8c80: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
8c90: 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65  OVERAGE./*.** Se
8ca0: 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74  t the value if t
8cb0: 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c  he iSrcLine fiel
8cc0: 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
8cd0: 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  usly coded instr
8ce0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8cf0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69  sqlite3VdbeSetLi
8d00: 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76  neNumber(Vdbe *v
8d10: 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20  , int iLine){.  
8d20: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
8d30: 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65  (v,-1)->iSrcLine
8d40: 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64   = iLine;.}.#end
8d50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42  if /* SQLITE_VDB
8d60: 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f  E_COVERAGE */../
8d70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
8d80: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
8d90: 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20  en address.  If 
8da0: 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d  the address is -
8db0: 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  1, then.** retur
8dc0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
8dd0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
8de0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
8df0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
8e00: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
8e10: 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
8e20: 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69  e calling of thi
8e30: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68  s.** routine, th
8e40: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
8e50: 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77  a dummy VdbeOp w
8e60: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
8e70: 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a    That opcode.**
8e80: 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74   is readable but
8e90: 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74   not writable, t
8ea0: 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74  hough it is cast
8eb0: 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76   to a writable v
8ec0: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  alue..** The ret
8ed0: 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f  urn of a dummy o
8ee0: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
8ef0: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
8f00: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a  e functioning.**
8f10: 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61   after an OOM fa
8f20: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
8f30: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
8f40: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
8f50: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
8f60: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
8f70: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
8f80: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
8f90: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
8fa0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
8fb0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
8fc0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
8fd0: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
8fe0: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
8ff0: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
9000: 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f  lgrind..*/.VdbeO
9010: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
9020: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
9030: 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39   addr){.  /* C89
9040: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
9050: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75  the constant "du
9060: 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69  mmy" will be ini
9070: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a  tialized to all.
9080: 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63    ** zeros, whic
9090: 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d  h is correct.  M
90a0: 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20  SVC generates a 
90b0: 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68  warning, neverth
90c0: 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74  eless. */.  stat
90d0: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
90e0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
90f0: 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f  MSVC warning abo
9100: 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ut no initialize
9110: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
9120: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9130: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
9140: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
9150: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
9160: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
9170: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
9180: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
9190: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
91a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
91b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
91c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
91d0: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
91e0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
91f0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
9200: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
9210: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9220: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
9230: 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  S)./*.** Return 
9240: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
9250: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
9260: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
9270: 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20  e opcode pOp.** 
9280: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
9290: 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74  aracter c..*/.st
92a0: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61  atic int transla
92b0: 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73  teP(char c, cons
92c0: 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66  t Op *pOp){.  if
92d0: 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72  ( c=='1' ) retur
92e0: 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  n pOp->p1;.  if(
92f0: 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e   c=='2' ) return
9300: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20   pOp->p2;.  if( 
9310: 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20  c=='3' ) return 
9320: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63  pOp->p3;.  if( c
9330: 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70  =='4' ) return p
9340: 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75  Op->p4.i;.  retu
9350: 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f  rn pOp->p5;.}../
9360: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
9370: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63  tring for the "c
9380: 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66  omment" field of
9390: 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c   a VDBE opcode l
93a0: 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  isting..**.** Th
93b0: 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c  e Synopsis: fiel
93c0: 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  d in comments in
93d0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
93e0: 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e  ce file gets con
93f0: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20  verted.** to an 
9400: 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61  extra string tha
9410: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
9420: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   the sqlite3Opco
9430: 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68  deName().  In th
9440: 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20  e.** absence of 
9450: 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20  other comments, 
9460: 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65  this synopsis be
9470: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e  comes the commen
9480: 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e  t on the opcode.
9490: 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61  .** Some transla
94a0: 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a  tion occurs:.**.
94b0: 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20  **       "PX"   
94c0: 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a     ->  "r[X]".**
94d0: 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20         "PX@PY"  
94e0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31   ->  "r[X..X+Y-1
94f0: 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66  ]"  or "r[x]" if
9500: 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20   y is 0 or 1.** 
9510: 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20        "PX@PY+1" 
9520: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20  ->  "r[X..X+Y]" 
9530: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9540: 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20  y is 0.**       
9550: 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72  "PY..PY"  ->  "r
9560: 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20  [X..Y]"      or 
9570: 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a  "r[x]" if y<=x.*
9580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
9590: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63  playComment(.  c
95a0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20  onst Op *pOp,   
95b0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
95c0: 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20  to be commented 
95d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
95e0: 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69  *zP4,   /* Previ
95f0: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76  ously obtained v
9600: 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20  alue for P4 */. 
9610: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20   char *zTemp,   
9620: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
9630: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ult here */.  in
9640: 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20  t nTemp         
9650: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
9660: 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a  ble in zTemp[] *
9670: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
9680: 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f  r *zOpName;.  co
9690: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70  nst char *zSynop
96a0: 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61  sis;.  int nOpNa
96b0: 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  me;.  int ii, jj
96c0: 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74 5b 35 30  ;.  char zAlt[50
96d0: 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  ];.  zOpName = s
96e0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
96f0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
9700: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
9710: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
9720: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
9730: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
9740: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
9750: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
9760: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
9770: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
9780: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69 66  Name + 1;.    if
9790: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
97a0: 73 69 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20  sis,"IF ",3)==0 
97b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
97c0: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54  ->p5 & SQLITE_ST
97d0: 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20  OREP2 ){.       
97e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
97f0: 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20  f(sizeof(zAlt), 
9800: 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28  zAlt, "r[P2] = (
9810: 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b  %s)", zSynopsis+
9820: 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  3);.      }else{
9830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9840: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
9850: 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69  (zAlt), zAlt, "i
9860: 66 20 25 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a  f %s goto P2", z
9870: 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20  Synopsis+3);.   
9880: 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f     }.      zSyno
9890: 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20  psis = zAlt;.   
98a0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a   }.    for(ii=jj
98b0: 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26  =0; jj<nTemp-1 &
98c0: 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73  & (c = zSynopsis
98d0: 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b  [ii])!=0; ii++){
98e0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50  .      if( c=='P
98f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
9900: 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d   zSynopsis[++ii]
9910: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
9920: 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='4' ){.        
9930: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9940: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
9950: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34  mp+jj, "%s", zP4
9960: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9970: 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20   if( c=='X' ){. 
9980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9990: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
99a0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
99b0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
99c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  t);.          se
99d0: 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20  enCom = 1;.     
99e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
99f0: 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61      int v1 = tra
9a00: 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b  nslateP(c, pOp);
9a10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
9a20: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  2;.          sql
9a30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9a40: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
9a50: 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20  , "%d", v1);.   
9a60: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
9a70: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
9a80: 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29  1, "@P", 2)==0 )
9a90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
9aa0: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
9ab0: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
9ac0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
9ad0: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j);.            
9ae0: 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v2 = translateP(
9af0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70  zSynopsis[ii], p
9b00: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Op);.           
9b10: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
9b20: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22  nopsis+ii+1,"+1"
9b30: 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
9b40: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b          ii += 2;
9b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76  .              v
9b60: 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2++;.           
9b70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
9b80: 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20  f( v2>1 ){.     
9b90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9ba0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
9bb0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e  jj, zTemp+jj, ".
9bc0: 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a  .%d", v1+v2-1);.
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9be0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9bf0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
9c00: 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22  sis+ii+1, "..P3"
9c10: 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  , 4)==0 && pOp->
9c20: 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p3==0 ){.       
9c30: 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20       ii += 4;.  
9c40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9c50: 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b    }.        jj +
9c60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9c70: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
9c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9c90: 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20    zTemp[jj++] = 
9ca0: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
9cb0: 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f  .    if( !seenCo
9cc0: 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20  m && jj<nTemp-5 
9cd0: 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  && pOp->zComment
9ce0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9cf0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9d00: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
9d10: 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ; %s", pOp->zCom
9d20: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20  ment);.      jj 
9d30: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
9d40: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
9d50: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e    }.    if( jj<n
9d60: 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d  Temp ) zTemp[jj]
9d70: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
9d80: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
9d90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
9da0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
9db0: 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d  Temp, "%s", pOp-
9dc0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
9dd0: 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  jj = sqlite3Strl
9de0: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  en30(zTemp);.  }
9df0: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b  else{.    zTemp[
9e00: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d  0] = 0;.    jj =
9e10: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9e20: 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   jj;.}.#endif /*
9e30: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9e40: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
9e50: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
9e60: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9e70: 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a  URSOR_HINTS)./*.
9e80: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65  ** Translate the
9e90: 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20   P4.pExpr value 
9ea0: 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72  for an OP_Cursor
9eb0: 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f  Hint opcode into
9ec0: 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61   text.** that ca
9ed0: 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 69  n be displayed i
9ee0: 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20  n the P4 column 
9ef0: 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75  of EXPLAIN outpu
9f00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9f10: 64 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28  d displayP4Expr(
9f20: 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 70  StrAccum *p, Exp
9f30: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e  r *pExpr){.  con
9f40: 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30  st char *zOp = 0
9f50: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
9f60: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
9f70: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
9f80: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
9f90: 70 70 65 6e 64 66 28 70 2c 20 22 25 51 22 2c 20  ppendf(p, "%Q", 
9fa0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
9fb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9fc0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
9fd0: 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ER:.      sqlite
9fe0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c  3_str_appendf(p,
9ff0: 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
a000: 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  iValue);.      b
a010: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a020: 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71  K_NULL:.      sq
a030: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a040: 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  f(p, "NULL");.  
a050: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a060: 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
a070: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
a080: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a090: 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e  "r[%d]", pExpr->
a0a0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
a0b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a0c0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
a0d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
a0e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
a0f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a100: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  str_appendf(p, "
a110: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
a120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
a130: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a140: 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74  f(p, "c%d", (int
a150: 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29  )pExpr->iColumn)
a160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a170: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a180: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
a190: 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20    zOp = "LT";   
a1a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a1b0: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a  se TK_LE:      z
a1c0: 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20  Op = "LE";      
a1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a1e0: 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20  TK_GT:      zOp 
a1f0: 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65  = "GT";      bre
a200: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a210: 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GE:      zOp = "
a220: 47 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GE";      break;
a230: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
a240: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22        zOp = "NE"
a250: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a260: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
a270: 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20     zOp = "EQ";  
a280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a290: 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
a2a0: 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20  zOp = "IS";     
a2b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a2c0: 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70   TK_ISNOT:   zOp
a2d0: 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72   = "ISNOT";   br
a2e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a2f0: 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _AND:     zOp = 
a300: 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "AND";     break
a310: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  ;.    case TK_OR
a320: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52  :      zOp = "OR
a330: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a340: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
a350: 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b      zOp = "ADD";
a360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a370: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
a380: 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20   zOp = "MUL";   
a390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a3a0: 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f  e TK_MINUS:   zO
a3b0: 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62  p = "SUB";     b
a3c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a3d0: 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d  K_REM:     zOp =
a3e0: 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61   "REM";     brea
a3f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
a400: 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42  ITAND:  zOp = "B
a410: 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ITAND";  break;.
a420: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
a430: 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f  R:   zOp = "BITO
a440: 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  R";   break;.   
a450: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
a460: 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20    zOp = "DIV";  
a470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a480: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a  se TK_LSHIFT:  z
a490: 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20  Op = "LSHIFT";  
a4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a4b0: 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_RSHIFT:  zOp 
a4c0: 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65  = "RSHIFT";  bre
a4d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a4e0: 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22  CONCAT:  zOp = "
a4f0: 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b  CONCAT";  break;
a500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
a510: 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e  NUS:  zOp = "MIN
a520: 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  US";   break;.  
a530: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
a540: 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b     zOp = "PLUS";
a550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a560: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20  ase TK_BITNOT:  
a570: 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20  zOp = "BITNOT"; 
a580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a590: 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70   TK_NOT:     zOp
a5a0: 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72   = "NOT";     br
a5b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a5c0: 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20  _ISNULL:  zOp = 
a5d0: 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b  "ISNULL";  break
a5e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
a5f0: 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f  TNULL: zOp = "NO
a600: 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
a610: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
a620: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
a630: 70 70 65 6e 64 66 28 70 2c 20 22 25 73 22 2c 20  ppendf(p, "%s", 
a640: 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62  "expr");.      b
a650: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
a660: 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69   zOp ){.    sqli
a670: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a680: 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a  p, "%s(", zOp);.
a690: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
a6a0: 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  r(p, pExpr->pLef
a6b0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  t);.    if( pExp
a6c0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
a6d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
a6e0: 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29  ppend(p, ",", 1)
a6f0: 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50  ;.      displayP
a700: 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e  4Expr(p, pExpr->
a710: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
a720: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
a730: 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29  ppend(p, ")", 1)
a740: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
a750: 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  * VDBE_DISPLAY_P
a760: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  4 && defined(SQL
a770: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
a780: 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69  R_HINTS) */...#i
a790: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  f VDBE_DISPLAY_P
a7a0: 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  4./*.** Compute 
a7b0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
a7c0: 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70  scribes the P4 p
a7d0: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
a7e0: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
a7f0: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
a800: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
a810: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
a820: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
a830: 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c  splayP4(Op *pOp,
a840: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
a850: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
a860: 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20   *zP4 = zTemp;. 
a870: 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61   StrAccum x;.  a
a880: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
a890: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72   );.  sqlite3Str
a8a0: 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c  AccumInit(&x, 0,
a8b0: 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30   zTemp, nTemp, 0
a8c0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
a8d0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
a8e0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
a8f0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a   {.      int j;.
a900: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
a910: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
a920: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
a930: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
a940: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
a950: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
a960: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
a970: 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49  x, "k(%d", pKeyI
a980: 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b  nfo->nKeyField);
a990: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
a9a0: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  j<pKeyInfo->nKey
a9b0: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
a9c0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
a9d0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
a9e0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
a9f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
aa00: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  oll = pColl ? pC
aa10: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b  oll->zName : "";
aa20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
aa30: 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41  cmp(zColl, "BINA
aa40: 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20  RY")==0 ) zColl 
aa50: 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73  = "B";.        s
aa60: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
aa70: 64 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20  df(&x, ",%s%s", 
aa80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa90: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
aaa0: 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20  rder[j] ? "-" : 
aab0: 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  "", zColl);.    
aac0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
aad0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c  3_str_append(&x,
aae0: 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ")", 1);.      
aaf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ab00: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ab10: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
ab20: 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a     case P4_EXPR:
ab30: 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79   {.      display
ab40: 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e  P4Expr(&x, pOp->
ab50: 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  p4.pExpr);.     
ab60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ab70: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
ab80: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
ab90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
aba0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
abb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
abc0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
abd0: 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  "(%.20s)", pColl
abe0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
abf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ac00: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
ac10: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
ac20: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
ac30: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
ac40: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
ac50: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
ac60: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
ac70: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
ac80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
ac90: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
aca0: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
acb0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
acc0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
acd0: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75  CCTX: {.      Fu
ace0: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
acf0: 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e  p->p4.pCtx->pFun
ad00: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
ad10: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
ad20: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
ad30: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
ad40: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
ad50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
ad60: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
ad70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
ad80: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
ad90: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
ada0: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
adb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
adc0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
add0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ade0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
adf0: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
ae00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ae10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
ae20: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
ae30: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
ae40: 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20  df(&x, "%.16g", 
ae50: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
ae60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ae70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
ae80: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
ae90: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
aea0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
aeb0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
aec0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
aed0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
aee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
aef0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
af00: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
af10: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
af20: 70 65 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22  pendf(&x, "%lld"
af30: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
af40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
af50: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
af60: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
af70: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
af80: 6e 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ndf(&x, "%.16g",
af90: 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20   pMem->u.r);.   
afa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
afb0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
afc0: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ull ){.        z
afd0: 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20  P4 = "NULL";.   
afe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aff0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
b000: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
b010: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   );.        zP4 
b020: 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20  = "(blob)";.    
b030: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b040: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
b060: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
b070: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
b080: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
b090: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
b0a0: 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
b0b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b0c0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 76 74 61  appendf(&x, "vta
b0d0: 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20  b:%p", pVtab);. 
b0e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b0f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
b100: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
b110: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
b120: 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f      int *ai = pO
b130: 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20  p->p4.ai;.      
b140: 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20  int n = ai[0];  
b150: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c   /* The first el
b160: 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41  ement of an INTA
b170: 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20 74  RRAY is always t
b180: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
b190: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75            ** cou
b1a0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
b1b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20   of elements to 
b1c0: 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  follow */.      
b1d0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69  for(i=1; i<=n; i
b1e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
b1f0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b200: 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69  (&x, ",%d", ai[i
b210: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
b220: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27    zTemp[0] = '['
b230: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b240: 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22  str_append(&x, "
b250: 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  ]", 1);.      br
b260: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b270: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
b280: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
b290: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b2a0: 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  x, "program");. 
b2b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b2c0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44 59  }.    case P4_DY
b2d0: 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20  NBLOB:.    case 
b2e0: 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20  P4_ADVANCE: {.  
b2f0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
b300: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b310: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b320: 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  _TABLE: {.      
b330: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b340: 6e 64 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f  ndf(&x, "%s", pO
b350: 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d  p->p4.pTab->zNam
b360: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
b370: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
b380: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
b390: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
b3a0: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
b3b0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
b3c0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
b3d0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
b3e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b3f0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
b400: 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73  inish(&x);.  ass
b410: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
b420: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
b430: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
b440: 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a  SPLAY_P4 */../*.
b450: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
b460: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
b470: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
b480: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
b490: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
b4a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
b4b0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
b4c0: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
b4d0: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
b4e0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
b4f0: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
b500: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
b510: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
b520: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
b530: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
b540: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
b550: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
b560: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
b570: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
b580: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
b590: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
b5a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b5b0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
b5c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
b5d0: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
b5e0: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
b5f0: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
b600: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
b610: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
b620: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
b630: 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73  sk)*8 );.  DbMas
b640: 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  kSet(p->btreeMas
b650: 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d  k, i);.  if( i!=
b660: 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  1 && sqlite3Btre
b670: 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d  eSharable(p->db-
b680: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
b690: 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d      DbMaskSet(p-
b6a0: 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20  >lockMask, i);. 
b6b0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
b6c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b6d0: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a  HARED_CACHE)./*.
b6e0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
b6f0: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70  compiled to supp
b700: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
b710: 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20   mode and to be 
b720: 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74  threadsafe,.** t
b730: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61  his routine obta
b740: 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73  ins the mutex as
b750: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
b760: 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75  ch BtShared stru
b770: 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61  cture.** that ma
b780: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  y be accessed by
b790: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
b7a0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
b7b0: 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c  n doing so it al
b7c0: 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  so.** sets the B
b7d0: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
b7e0: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
b7f0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
b800: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
b810: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
b820: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
b830: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
b840: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
b850: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
b860: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
b870: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
b880: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
b890: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
b8a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b8b0: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
b8c0: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
b8d0: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
b8e0: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
b8f0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
b900: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
b910: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
b920: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
b930: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a  d with the VM..*
b940: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
b950: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
b960: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
b970: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
b980: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
b990: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
b9a0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
b9b0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65  p->btreeMask fie
b9c0: 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ld is a bitmask 
b9d0: 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68  of all btrees th
b9e0: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
b9f0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20  .** statement p 
ba00: 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20  will ever use.  
ba10: 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d  Let N be the num
ba20: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70  ber of bits in p
ba30: 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63  ->btreeMask.** c
ba40: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
ba50: 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20  btrees that use 
ba60: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
ba70: 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20  hen the runtime 
ba80: 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  of.** this routi
ba90: 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20  ne is N*N.  But 
baa0: 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d  as N is rarely m
bab0: 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73  ore than 1, this
bac0: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62   should not.** b
bad0: 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
bae0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
baf0: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
bb00: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
bb10: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
bb20: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
bb30: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
bb40: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
bb50: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
bb60: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
bb70: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
bb80: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
bb90: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
bba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
bbb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
bbc0: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
bbd0: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
bbe0: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
bbf0: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
bc00: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
bc10: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
bc20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
bc30: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
bc40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bc50: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
bc60: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
bc70: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
bc80: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
bc90: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
bca0: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
bcb0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
bcc0: 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ter()..*/.static
bcd0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
bce0: 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28   void vdbeLeave(
bcf0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
bd00: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
bd10: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
bd20: 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70  nt nDb;.  db = p
bd30: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
bd40: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
bd50: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
bd60: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
bd70: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
bd80: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
bd90: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
bda0: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
bdb0: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
bdc0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
bdd0: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
bde0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
bdf0: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
be00: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d  e *p){.  if( DbM
be10: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
be20: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
be30: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
be40: 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c   case */.  vdbeL
be50: 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69  eave(p);.}.#endi
be60: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  f..#if defined(V
be70: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
be80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
be90: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
bea0: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
beb0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
bec0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
bed0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
bee0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
bef0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
bf00: 75 74 2c 20 69 6e 74 20 70 63 2c 20 56 64 62 65  ut, int pc, Vdbe
bf10: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
bf20: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
bf30: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
bf40: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
bf50: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
bf60: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
bf70: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
bf80: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
bf90: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
bfa0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
bfb0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
bfc0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
bfd0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
bfe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
bff0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
c000: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
c010: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
c020: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
c030: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
c040: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
c050: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
c060: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
c070: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
c080: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
c090: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
c0a0: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
c0b0: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
c0c0: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
c0d0: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
c0e0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
c0f0: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
c100: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
c110: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
c120: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
c130: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
c140: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
c150: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
c160: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
c170: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
c180: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
c190: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
c1a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
c1b0: 69 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61  itialize an arra
c1c0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
c1d0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
c1e0: 69 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28  id initMemArray(
c1f0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73  Mem *p, int N, s
c200: 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20  qlite3 *db, u16 
c210: 66 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28  flags){.  while(
c220: 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20   (N--)>0 ){.    
c230: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
c240: 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  p->flags = flags
c250: 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f  ;.    p->szMallo
c260: 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
c270: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
c280: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30  ->pScopyFrom = 0
c290: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b  ;.#endif.    p++
c2a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
c2b0: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
c2c0: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
c2d0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
c2e0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c2f0: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
c300: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
c310: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d  .    Mem *pEnd =
c320: 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69   &p[N];.    sqli
c330: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
c340: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
c350: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
c360: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
c370: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
c380: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c390: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
c3a0: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b        }while( (+
c3b0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
c3c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c3d0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73      do{.      as
c3e0: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
c3f0: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
c400: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
c410: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c420: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
c430: 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20  riants(p) );..  
c440: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
c450: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
c460: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
c470: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
c480: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
c490: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
c4a0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
c4b0: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
c4c0: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
c4d0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
c4e0: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
c4f0: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
c500: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
c510: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
c520: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
c530: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
c540: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
c550: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
c560: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
c570: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
c580: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
c590: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
c5a0: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
c5b0: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
c5c0: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
c5d0: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
c5e0: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
c5f0: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
c600: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
c610: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
c620: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
c630: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
c640: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
c650: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
c660: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
c670: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
c680: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
c690: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
c6a0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
c6b0: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
c6c0: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
c6d0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
c6e0: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
c6f0: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
c700: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
c710: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
c720: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
c730: 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20   MEM_Agg );.    
c740: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
c750: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
c760: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c770: 28 20 70 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69 74  ( p->xDel==sqlit
c780: 65 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65  e3VdbeFrameMemDe
c790: 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l );.      if( p
c7a0: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
c7b0: 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20  |MEM_Dyn) ){.   
c7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c7d0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
c7e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
c7f0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  ->szMalloc ){.  
c800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c810: 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61  reeNN(db, p->zMa
c820: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
c830: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
c840: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
c850: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e  ->flags = MEM_Un
c860: 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68  defined;.    }wh
c870: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
c880: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66  );.  }.}..#ifdef
c890: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
c8a0: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
c8b0: 70 46 72 61 6d 65 20 69 73 20 61 20 76 61 6c 69  pFrame is a vali
c8c0: 64 20 56 64 62 65 46 72 61 6d 65 20 70 6f 69 6e  d VdbeFrame poin
c8d0: 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ter.  Return tru
c8e0: 65 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e  e if it is.** an
c8f0: 64 20 66 61 6c 73 65 20 69 66 20 73 6f 6d 65 74  d false if somet
c900: 68 69 6e 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a  hing is wrong..*
c910: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c920: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
c930: 72 20 75 73 65 20 69 6e 73 69 64 65 20 6f 66 20  r use inside of 
c940: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c950: 6e 74 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  nts only..*/.int
c960: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
c970: 65 49 73 56 61 6c 69 64 28 56 64 62 65 46 72 61  eIsValid(VdbeFra
c980: 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69  me *pFrame){.  i
c990: 66 28 20 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d  f( pFrame->iFram
c9a0: 65 4d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 46  eMagic!=SQLITE_F
c9b0: 52 41 4d 45 5f 4d 41 47 49 43 20 29 20 72 65 74  RAME_MAGIC ) ret
c9c0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
c9d0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  1;.}.#endif.../*
c9e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 65  .** This is a de
c9f0: 73 74 72 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65  structor on a Me
ca00: 6d 20 6f 62 6a 65 63 74 20 28 77 68 69 63 68 20  m object (which 
ca10: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c  is really an sql
ca20: 69 74 65 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74  ite3_value).** t
ca30: 68 61 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  hat deletes the 
ca40: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 74 68 61  Frame object tha
ca50: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
ca60: 20 69 74 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a   it as a blob..*
ca70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ca80: 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74  e does not delet
ca90: 65 20 74 68 65 20 46 72 61 6d 65 20 72 69 67 68  e the Frame righ
caa0: 74 20 61 77 61 79 2e 20 20 49 74 20 6d 65 72 65  t away.  It mere
cab0: 6c 79 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 66  ly adds the.** f
cac0: 72 61 6d 65 20 74 6f 20 61 20 6c 69 73 74 20 6f  rame to a list o
cad0: 66 20 66 72 61 6d 65 73 20 74 6f 20 62 65 20 64  f frames to be d
cae0: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
caf0: 56 64 62 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76  Vdbe halts..*/.v
cb00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
cb10: 72 61 6d 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20  rameMemDel(void 
cb20: 2a 70 41 72 67 29 7b 0a 20 20 56 64 62 65 46 72  *pArg){.  VdbeFr
cb30: 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 28 56  ame *pFrame = (V
cb40: 64 62 65 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a  dbeFrame*)pArg;.
cb50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cb60: 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69  3VdbeFrameIsVali
cb70: 64 28 70 46 72 61 6d 65 29 20 29 3b 0a 20 20 70  d(pFrame) );.  p
cb80: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d  Frame->pParent =
cb90: 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c   pFrame->v->pDel
cba0: 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d  Frame;.  pFrame-
cbb0: 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20  >v->pDelFrame = 
cbc0: 70 46 72 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pFrame;.}.../*.*
cbd0: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
cbe0: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
cbf0: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
cc00: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
cc10: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
cc20: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
cc30: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
cc40: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
cc50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
cc60: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
cc70: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
cc80: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
cc90: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
cca0: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
ccb0: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
ccc0: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
ccd0: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
cce0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ccf0: 65 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c  e3VdbeFrameIsVal
cd00: 69 64 28 70 29 20 29 3b 0a 20 20 66 6f 72 28 69  id(p) );.  for(i
cd10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43  =0; i<p->nChildC
cd20: 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  sr; i++){.    sq
cd30: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
cd40: 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b  sor(p->v, apCsr[
cd50: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
cd60: 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c  seMemArray(aMem,
cd70: 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a   p->nChildMem);.
cd80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
cd90: 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d  eteAuxData(p->v-
cda0: 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
cdb0: 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c  a, -1, 0);.  sql
cdc0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
cdd0: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
cde0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cdf0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
ce00: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
ce10: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
ce20: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
ce30: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
ce40: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
ce50: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
ce60: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
ce70: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
ce80: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
ce90: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
cea0: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
ceb0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
cec0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
ced0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
cee0: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
cef0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
cf00: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
cf10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
cf20: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
cf30: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
cf40: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
cf50: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
cf60: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
cf70: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
cf80: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
cf90: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
cfa0: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
cfb0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
cfc0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
cfd0: 0a 2a 2a 20 32 30 31 38 2d 30 34 2d 32 34 3a 20  .** 2018-04-24: 
cfe0: 20 49 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   In p->explain==
cff0: 32 20 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49  2 mode, the OP_I
d000: 6e 69 74 20 6f 70 63 6f 64 65 73 20 6f 66 20 74  nit opcodes of t
d010: 72 69 67 67 65 72 73 0a 2a 2a 20 61 72 65 20 61  riggers.** are a
d020: 6c 73 6f 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68  lso shown, so th
d030: 61 74 20 74 68 65 20 62 6f 75 6e 64 61 72 69 65  at the boundarie
d040: 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 6d 61  s between the ma
d050: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a  in program and.*
d060: 2a 20 65 61 63 68 20 74 72 69 67 67 65 72 20 61  * each trigger a
d070: 72 65 20 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20  re clear..**.** 
d080: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
d090: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
d0a0: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
d0b0: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
d0c0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
d0d0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
d0e0: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
d0f0: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
d100: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
d110: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d130: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
d140: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
d170: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
d180: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
d190: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
d1c0: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
d1d0: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
d1e0: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d200: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
d210: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
d220: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d240: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
d250: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
d260: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
d270: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d290: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
d2a0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
d2b0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
d2e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
d2f0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d310: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d320: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
d330: 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20  aMem[1];        
d340: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
d350: 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20  m of result set 
d360: 2a 2f 0a 20 20 69 6e 74 20 62 4c 69 73 74 53 75  */.  int bListSu
d370: 62 70 72 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70  bprogs = (p->exp
d380: 6c 61 69 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e  lain==1 || (db->
d390: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54  flags & SQLITE_T
d3a0: 72 69 67 67 65 72 45 51 50 29 21 3d 30 29 3b 0a  riggerEQP)!=0);.
d3b0: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a    Op *pOp = 0;..
d3c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
d3d0: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
d3e0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
d3f0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
d400: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
d410: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
d420: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
d430: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
d440: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
d450: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
d460: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
d470: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
d480: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
d490: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
d4a0: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
d4b0: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
d4c0: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
d4d0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
d4e0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
d4f0: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
d500: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
d510: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
d520: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
d530: 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75  , 8);.  p->pResu
d540: 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ltSet = 0;..  if
d550: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d560: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  NOMEM ){.    /* 
d570: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
d580: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
d590: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
d5a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
d5b0: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
d5c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
d5d0: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
d5e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
d5f0: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
d600: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
d610: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
d620: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
d630: 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68  utput rows reach
d640: 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65  es nRow, that me
d650: 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  ans the.  ** lis
d660: 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  ting has finishe
d670: 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74  d and sqlite3_st
d680: 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75  ep() should retu
d690: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
d6a0: 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65    ** nRow is the
d6b0: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
d6c0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
d6d0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  e main program, 
d6e0: 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75  plus.  ** the su
d6f0: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
d700: 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74  of rows in all t
d710: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
d720: 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  ms encountered. 
d730: 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65   ** so far.  The
d740: 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c   nRow value will
d750: 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77   increase as new
d760: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
d770: 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e  rams are.  ** en
d780: 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70  countered, but p
d790: 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75  ->pc will eventu
d7a0: 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f  ally catch up to
d7b0: 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52   nRow..  */.  nR
d7c0: 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  ow = p->nOp;.  i
d7d0: 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73  f( bListSubprogs
d7e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
d7f0: 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65  irst 8 memory ce
d800: 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  lls are used for
d810: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
d820: 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20    So we will.   
d830: 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74   ** commandeer t
d840: 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75  he 9th cell to u
d850: 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f  se as storage fo
d860: 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  r an array of po
d870: 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f  inters.    ** to
d880: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
d890: 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20  rams.  The VDBE 
d8a0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
d8b0: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39   have at least 9
d8c0: 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20  .    ** cells.  
d8d0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
d8e0: 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20  ->nMem>9 );.    
d8f0: 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pSub = &p->aMem[
d900: 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  9];.    if( pSub
d910: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
d920: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20   ){.      /* On 
d930: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
d940: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
d950: 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64  , pSub will hold
d960: 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a   a NULL.  It is.
d970: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
d980: 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62  ized to a BLOB b
d990: 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47  y the P4_SUBPROG
d9a0: 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  RAM processing l
d9b0: 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ogic below */.  
d9c0: 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d      nSub = pSub-
d9d0: 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29  >n/sizeof(Vdbe*)
d9e0: 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20  ;.      apSub = 
d9f0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
da00: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20  Sub->z;.    }.  
da10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
da20: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  b; i++){.      n
da30: 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d  Row += apSub[i]-
da40: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >nOp;.    }.  }.
da50: 0a 20 20 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a  .  while(1){  /*
da60: 20 4c 6f 6f 70 20 65 78 69 74 73 20 76 69 61 20   Loop exits via 
da70: 62 72 65 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d  break */.    i =
da80: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66   p->pc++;.    if
da90: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
daa0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
dab0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  E_OK;.      rc =
dac0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
dad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
dae0: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
daf0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
db00: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
db10: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
db20: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
db30: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
db40: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
db50: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
db60: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
db70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db80: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
db90: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
dba0: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
dbb0: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
dbc0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
dbd0: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
dbe0: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
dbf0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
dc00: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
dc10: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
dc20: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
dc30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
dc40: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
dc50: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
dc60: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
dc70: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
dc80: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20  .    /* When an 
dc90: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
dca0: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
dcb0: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
dcc0: 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  that has.    ** 
dcd0: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
dce0: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
dcf0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
dd00: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
dd10: 6f 67 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65  ograms.    ** ke
dd20: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
dd30: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
dd40: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
dd50: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
dd60: 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73  ogram.    ** has
dd70: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
dd80: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  n seen..    */. 
dd90: 20 20 20 69 66 28 20 62 4c 69 73 74 53 75 62 70     if( bListSubp
dda0: 72 6f 67 73 20 26 26 20 70 4f 70 2d 3e 70 34 74  rogs && pOp->p4t
ddb0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
ddc0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
ddd0: 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29  nByte = (nSub+1)
dde0: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
ddf0: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  am*);.      int 
de00: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
de10: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
de20: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
de30: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
de40: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
de50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
de60: 28 20 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20  ( j==nSub ){.   
de70: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
de80: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
de90: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
dea0: 62 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b!=0);.        i
deb0: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
dec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
ded0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
dee0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OR;.          br
def0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
df00: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
df10: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
df20: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61  ub->z;.        a
df30: 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70  pSub[nSub++] = p
df40: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  Op->p4.pProgram;
df50: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66  .        pSub->f
df60: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
df70: 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
df80: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
df90: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
dfa0: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f        nRow += pO
dfb0: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e  p->p4.pProgram->
dfc0: 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nOp;.      }.   
dfd0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
dfe0: 70 6c 61 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b  plain<2 ) break;
dff0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
e000: 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e  code==OP_Explain
e010: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
e020: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
e030: 50 5f 49 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e  P_Init && p->pc>
e040: 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  1 ) break;.  }..
e050: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e060: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64  _OK ){.    if( d
e070: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
e080: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ted ){.      p->
e090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
e0a0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 63 20  RRUPT;.      rc 
e0b0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e0d0: 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65  eError(p, sqlite
e0e0: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
e0f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e100: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
e110: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
e120: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  n==1 ){.        
e130: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e140: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  M_Int;.        p
e150: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e180: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
e190: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b  */.        pMem+
e1a0: 2b 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20  +;.    .        
e1b0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e1c0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
e1d0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
e1e0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
e1f0: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
e200: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
e210: 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  e); /* Opcode */
e220: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e230: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
e240: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
e250: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e260: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
e270: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
e280: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
e290: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
e2a0: 20 20 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d    }..      pMem-
e2b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e2c0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
e2d0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
e300: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
e310: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e320: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e330: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
e340: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e360: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P2 */.      pM
e370: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65  em++;..      pMe
e380: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e390: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
e3a0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
e3d0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
e3e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e3f0: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
e400: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30  Resize(pMem, 100
e410: 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ) ){ /* P4 */.  
e420: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
e430: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e440: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
e450: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e470: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e480: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
e490: 20 20 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70        zP4 = disp
e4a0: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
e4b0: 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  >z, pMem->szMall
e4c0: 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  oc);.      if( z
e4d0: 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20  P4!=pMem->z ){. 
e4e0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
e4f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
e500: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
e510: 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20  (pMem, zP4, -1, 
e520: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
e530: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
e550: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
e560: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
e570: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
e580: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
e590: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
e5a0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 7d  TE_UTF8;.      }
e5b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
e5c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70        if( p->exp
e5d0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
e5e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
e5f0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
e600: 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a  ize(pMem, 4) ){.
e610: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e620: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
e630: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
e640: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e650: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e660: 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  }.        pMem->
e670: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
e680: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
e690: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
e6a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
e6b0: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
e6c0: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
e6d0: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
e6e0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
e6f0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
e700: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ;.        pMem++
e710: 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
e720: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
e730: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
e740: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e750: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
e760: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
e770: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
e780: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
e790: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
e7a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e7b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d      }.        pM
e7d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e7e0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
e7f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
e800: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
e810: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
e820: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 20 20  , 500);.        
e830: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
e840: 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20  TE_UTF8;.#else. 
e850: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
e860: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
e890: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  */.#endif.      
e8a0: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 73  }..      p->nRes
e8b0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
e8c0: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
e8d0: 20 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53       p->pResultS
e8e0: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
e8f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
e900: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
e910: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
e920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
e930: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
e940: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e950: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
e960: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
e970: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
e980: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
e990: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
e9a0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
e9b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
e9c0: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
e9d0: 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
e9e0: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
e9f0: 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a  p->zSql ){.    z
ea00: 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65   = p->zSql;.  }e
ea10: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d  lse if( p->nOp>=
ea20: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56  1 ){.    const V
ea30: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
ea40: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28  >aOp[0];.    if(
ea50: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
ea60: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
ea70: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
ea80: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
ea90: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
eaa0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
eab0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
eac0: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
ead0: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
eae0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
eaf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
eb00: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
eb10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
eb20: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
eb30: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
eb40: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
eb50: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
eb60: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
eb70: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
eb80: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
eb90: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
eba0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
ebb0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
ebc0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
ebd0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
ebe0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
ebf0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
ec00: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
ec10: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
ec20: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
ec30: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
ec40: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
ec50: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
ec60: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
ec70: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
ec80: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
ec90: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
eca0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
ecb0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
ecc0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ecd0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
ece0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
ecf0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
ed00: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
ed10: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
ed20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ed30: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
ed40: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
ed50: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
ed60: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
ed70: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
ed80: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
ed90: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
eda0: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
edb0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
edc0: 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
edd0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
ede0: 64 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d  describes bulk m
edf0: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
ee00: 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75  for use.** by su
ee10: 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61  bcomponents of a
ee20: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
ee30: 65 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61  ent.  Space is a
ee40: 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20  llocated out.** 
ee50: 6f 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61  of a ReusableSpa
ee60: 63 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65  ce object by the
ee70: 20 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f   allocSpace() ro
ee80: 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  utine below..*/.
ee90: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
eea0: 70 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70  pace {.  u8 *pSp
eeb0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ace;          /*
eec0: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
eed0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  y */.  int nFree
eee0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
eef0: 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
ef00: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  e memory */.  in
ef10: 74 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20  t nNeeded;      
ef20: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65     /* Total byte
ef30: 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74  s that could not
ef40: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f   be allocated */
ef50: 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61  .};../* Try to a
ef60: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
ef70: 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  tes of 8-byte al
ef80: 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72  igned bulk memor
ef90: 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72  y for pBuf.** fr
efa0: 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  om the ReusableS
efb0: 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65  pace object.  Re
efc0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
efd0: 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a  o the allocated.
efe0: 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63  ** memory on suc
eff0: 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66  cess.  If insuff
f000: 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73  icient memory is
f010: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
f020: 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61  e.** ReusableSpa
f030: 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65  ce object, incre
f040: 61 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65  ase the Reusable
f050: 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a  Space.nNeeded.**
f060: 20 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d   value by the am
f070: 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20  ount needed and 
f080: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
f090: 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  ** If pBuf is no
f0a0: 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  t initially NULL
f0b0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
f0c0: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73  t the memory has
f0d0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
f0e0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20   allocated by a 
f0f0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
f100: 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a  is routine, so j
f110: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70  ust return a cop
f120: 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64  y.** of pBuf and
f130: 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53   leave ReusableS
f140: 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  pace unchanged..
f150: 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63  **.** This alloc
f160: 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64  ator is employed
f170: 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e   to repurpose un
f180: 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68  used slots at th
f190: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
f1a0: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20  opcode array of 
f1b0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66  prepared state f
f1c0: 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20  or other memory 
f1d0: 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65  needs of the pre
f1e0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
f1f0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
f200: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
f210: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
f220: 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42  eSpace *p,  /* B
f230: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
f240: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
f250: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
f260: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
f270: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
f280: 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74   a prior allocat
f290: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ion */.  int nBy
f2a0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
f2b0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d     /* Bytes of m
f2c0: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
f2d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
f2e0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
f2f0: 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a  T(p->pSpace) );.
f300: 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b    if( pBuf==0 ){
f310: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
f320: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  ND8(nByte);.    
f330: 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e  if( nByte <= p->
f340: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  nFree ){.      p
f350: 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65  ->nFree -= nByte
f360: 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
f370: 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72  p->pSpace[p->nFr
f380: 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ee];.    }else{.
f390: 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64        p->nNeeded
f3a0: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
f3b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
f3c0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
f3d0: 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72  ENT(pBuf) );.  r
f3e0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
f3f0: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
f400: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
f410: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
f420: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
f430: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
f440: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
f450: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
f460: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
f470: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
f480: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
f490: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
f4a0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
f4b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f4c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
f4d0: 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e  AGIC_INIT || p->
f4e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
f4f0: 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a  C_RESET );..  /*
f500: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
f510: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
f520: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
f530: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
f540: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
f550: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
f560: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
f570: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
f580: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
f590: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
f5a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f5b0: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b  DEBUG.  for(i=0;
f5c0: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
f5d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
f5e0: 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e  >aMem[i].db==p->
f5f0: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
f600: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
f610: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
f620: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
f630: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
f640: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
f650: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
f660: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
f670: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
f680: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
f690: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
f6a0: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
f6b0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
f6c0: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
f6d0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
f6e0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
f6f0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
f700: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
f710: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
f720: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
f730: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
f740: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
f750: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
f760: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
f770: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
f780: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
f790: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
f7a0: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
f7b0: 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
f7c0: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
f7d0: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
f7e0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
f7f0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
f800: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
f810: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
f820: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
f830: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
f840: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
f850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
f860: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
f870: 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
f880: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
f890: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
f8a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f8b0: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
f8c0: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
f8d0: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
f8e0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
f8f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
f900: 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
f910: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
f920: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
f930: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
f940: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
f950: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
f960: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
f970: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
f980: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
f990: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
f9a0: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
f9b0: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
f9c0: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
f9d0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
f9e0: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
f9f0: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
fa00: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
fa10: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
fa20: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
fa30: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
fa40: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
fa50: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
fa60: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
fa70: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
fa80: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
fa90: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
fac0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
fad0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
fae0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
faf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
fb00: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb20: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
fb30: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
fb40: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb60: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
fb70: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
fb80: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
fb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fba0: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
fbb0: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
fbc0: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fbe0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
fbf0: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
fc00: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
fc30: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
fc40: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
fc50: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
fc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fc70: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fc80: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
fc90: 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f  pace x;        /
fca0: 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20  * Reusable bulk 
fcb0: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73  memory */..  ass
fcc0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
fcd0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
fce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fcf0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
fd00: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
fd10: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
fd20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
fd30: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
fd40: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
fd50: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
fd60: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
fd70: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
fd80: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
fd90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
fda0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
fdb0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
fdc0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
fdd0: 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75  .  .  /* Each cu
fde0: 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f  rsor uses a memo
fdf0: 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69  ry cell.  The fi
fe00: 72 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73  rst cursor (curs
fe10: 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75  or 0) can.  ** u
fe20: 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68  se aMem[0] which
fe30: 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
fe40: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  e used by the VD
fe50: 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c  BE program.  All
fe60: 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65  ocate.  ** space
fe70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
fe80: 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72  Mem[] for cursor
fe90: 73 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e  s 1 and greater.
fea0: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
feb0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
fec0: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
fed0: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20   nCursor;.  if( 
fee0: 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d  nCursor==0 && nM
fef0: 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20  em>0 ) nMem++;  
ff00: 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65  /* Space for aMe
ff10: 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74  m[0] even if not
ff20: 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46   used */..  /* F
ff30: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
ff40: 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f  ch reusable memo
ff50: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
ff60: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ff70: 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72  e.  ** opcode ar
ff80: 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61  ray.  This extra
ff90: 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
ffa0: 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  reallocated for 
ffb0: 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20  other elements. 
ffc0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61   ** of the prepa
ffd0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
ffe0: 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38   */.  n = ROUND8
fff0: 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e  (sizeof(Op)*p->n
10000 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  Op);            
10010 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70    /* Bytes of op
10020 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64  code memory used
10030 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d   */.  x.pSpace =
10040 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b   &((u8*)p->aOp)[
10050 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  n];             
10060 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f    /* Unused opco
10070 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  de memory */.  a
10080 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
10090 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53  E_ALIGNMENT(x.pS
100a0 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72  pace) );.  x.nFr
100b0 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  ee = ROUNDDOWN8(
100c0 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f  pParse->szOpAllo
100d0 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65  c - n);  /* Byte
100e0 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f  s of unused memo
100f0 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ry */.  assert( 
10100 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  x.nFree>=0 );.  
10110 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
10120 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e  TE_ALIGNMENT(&x.
10130 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29  pSpace[x.nFree])
10140 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
10150 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
10160 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
10170 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
10180 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
10190 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
101a0 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
101b0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
101c0 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
101d0 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
101e0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
101f0 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
10200 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
10210 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
10220 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
10230 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77  ted in one or tw
10240 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
10250 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
10260 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
10270 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79  se unused memory
10280 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e   at the .  ** en
10290 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
102a0 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72  array.  If we ar
102b0 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69  e unable to sati
102c0 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20  sfy all memory. 
102d0 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73   ** requirements
102e0 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20   by reusing the 
102f0 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69  opcode array tai
10300 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  l, then the seco
10310 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  nd.  ** pass wil
10320 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
10330 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20  mainder using a 
10340 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c  fresh memory all
10350 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
10360 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
10370 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
10380 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
10390 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
103a0 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
103b0 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79   leftover memory
103c0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
103d0 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
103e0 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69    This can signi
103f0 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65  ficantly.  ** re
10400 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
10410 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
10420 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
10430 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64  tement..  */.  d
10440 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65  o {.    x.nNeede
10450 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  d = 0;.    p->aM
10460 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
10470 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  &x, p->aMem, nMe
10480 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
10490 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
104a0 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
104b0 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
104c0 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e  f(Mem));.    p->
104d0 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
104e0 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c  ce(&x, p->apArg,
104f0 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
10500 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  *));.    p->apCs
10510 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
10520 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  x, p->apCsr, nCu
10530 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
10540 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65  Cursor*));.#ifde
10550 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10560 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
10570 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
10580 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
10590 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
105a0 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
105b0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 78 2e  endif.    if( x.
105c0 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20 62 72 65  nNeeded==0 ) bre
105d0 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61 63 65  ak;.    x.pSpace
105e0 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71   = p->pFree = sq
105f0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
10600 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64  NN(db, x.nNeeded
10610 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d  );.    x.nFree =
10620 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77   x.nNeeded;.  }w
10630 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  hile( !db->mallo
10640 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
10650 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65  >pVList = pParse
10660 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72  ->pVList;.  pPar
10670 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b  se->pVList =  0;
10680 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
10690 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
106a0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
106b0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
106c0 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20  ->nVar = 0;.    
106d0 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a  p->nCursor = 0;.
106e0 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b      p->nMem = 0;
106f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
10700 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
10710 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20  or;.    p->nVar 
10720 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
10730 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
10740 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64  p->aVar, nVar, d
10750 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
10760 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
10770 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72  ;.    initMemArr
10780 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ay(p->aMem, nMem
10790 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69  , db, MEM_Undefi
107a0 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ned);.    memset
107b0 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43  (p->apCsr, 0, nC
107c0 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
107d0 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64  eCursor*));.#ifd
107e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
107f0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
10800 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61  .    memset(p->a
10810 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70  nExec, 0, p->nOp
10820 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
10830 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
10840 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
10850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10860 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
10870 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
10880 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
10890 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
108a0 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
108b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
108c0 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
108d0 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
108e0 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
108f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
10900 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
10910 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c   pCx->pBtx==0 ||
10920 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d   pCx->eCurType==
10930 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
10940 0a 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e  .  switch( pCx->
10950 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20  eCurType ){.    
10960 63 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52  case CURTYPE_SOR
10970 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
10980 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
10990 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
109a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
109b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52    }.    case CUR
109c0 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20  TYPE_BTREE: {.  
109d0 20 20 20 20 69 66 28 20 70 43 78 2d 3e 69 73 45      if( pCx->isE
109e0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
109f0 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74      if( pCx->pBt
10a00 78 20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65  x ) sqlite3Btree
10a10 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 78 29  Close(pCx->pBtx)
10a20 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
10a30 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
10a40 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
10a50 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
10a60 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
10a70 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
10a80 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  above. */.      
10a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
10aa0 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70  ssert( pCx->uc.p
10ab0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
10ac0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10ad0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
10ae0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
10af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10b00 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
10b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10b20 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
10b30 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42  ase CURTYPE_VTAB
10b40 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
10b50 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
10b60 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70  VCur = pCx->uc.p
10b70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73  VCur;.      cons
10b80 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
10b90 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75   *pModule = pVCu
10ba0 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
10bb0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
10bc0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
10bd0 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  Ref>0 );.      p
10be0 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
10bf0 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75  f--;.      pModu
10c00 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72  le->xClose(pVCur
10c10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10c20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10c40 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74  all cursors in t
10c50 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
10c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10c70 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
10c80 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  rame(Vdbe *p){. 
10c90 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
10ca0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
10cc0 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
10cd0 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
10ce0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
10cf0 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
10d00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10d10 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
10d20 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
10d30 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
10d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10d50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  }.}../*.** Copy 
10d60 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
10d70 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
10d80 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
10d90 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
10da0 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
10db0 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
10dc0 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
10dd0 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
10de0 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
10df0 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
10e00 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
10e10 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
10e20 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
10e30 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
10e40 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
10e50 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
10e60 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64  InFrame(v);.#ifd
10e70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10e80 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
10e90 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70  .  v->anExec = p
10ea0 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23  Frame->anExec;.#
10eb0 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d  endif.  v->aOp =
10ec0 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
10ed0 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
10ee0 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
10ef0 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
10f00 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
10f10 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
10f20 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
10f30 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
10f40 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
10f50 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
10f60 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
10f70 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
10f80 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
10f90 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
10fa0 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  v->db->nChange =
10fb0 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e   pFrame->nDbChan
10fc0 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ge;.  sqlite3Vdb
10fd0 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 76  eDeleteAuxData(v
10fe0 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61  ->db, &v->pAuxDa
10ff0 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d  ta, -1, 0);.  v-
11000 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46 72 61  >pAuxData = pFra
11010 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  me->pAuxData;.  
11020 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
11030 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
11040 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a  Frame->pc;.}../*
11050 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
11060 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  rsors..**.** Als
11070 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79  o release any dy
11080 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c  namic memory hel
11090 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74  d by the VM in t
110a0 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d  he Vdbe.aMem mem
110b0 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72  ory .** cell arr
110c0 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65  ay. This is nece
110d0 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d  ssary as the mem
110e0 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d  ory cell array m
110f0 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f  ay contain.** po
11100 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72  inters to VdbeFr
11110 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69  ame objects, whi
11120 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63  ch may in turn c
11130 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
11140 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  to.** open curso
11150 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
11160 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
11170 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
11180 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
11190 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
111a0 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
111b0 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
111c0 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
111d0 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
111e0 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
111f0 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
11200 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
11210 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
11220 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65  0;.    p->nFrame
11230 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
11240 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30  rt( p->nFrame==0
11250 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f   );.  closeCurso
11260 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20  rsInFrame(p);.  
11270 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
11280 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
11290 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e  ay(p->aMem, p->n
112a0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
112b0 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
112c0 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
112d0 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
112e0 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
112f0 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
11300 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
11310 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
11320 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
11330 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
11340 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
11350 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
11360 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
11370 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
11380 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
11390 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41  ta(p->db, &p->pA
113a0 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
113b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75    assert( p->pAu
113c0 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xData==0 );.}../
113d0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
113e0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
113f0 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
11400 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
11410 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
11420 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
11430 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
11440 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
11450 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
11460 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
11470 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
11480 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
11490 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
114a0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
114b0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
114c0 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
114d0 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
114e0 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
114f0 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
11500 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
11510 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11520 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
11530 20 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75   if( p->nResColu
11540 6d 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  mn ){.    releas
11550 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
11560 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
11570 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
11580 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
11590 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
115a0 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e  me);.  }.  n = n
115b0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
115c0 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
115d0 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
115e0 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
115f0 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
11600 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11610 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  NN(db, sizeof(Me
11620 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
11630 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
11640 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d  eturn;.  initMem
11650 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
11660 65 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75  e, n, db, MEM_Nu
11670 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ll);.}../*.** Se
11680 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
11690 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
116a0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
116b0 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
116c0 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
116d0 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
116e0 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
116f0 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
11700 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
11710 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
11720 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
11730 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
11740 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
11750 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
11760 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
11770 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
11780 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
11790 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
117a0 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
117b0 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
117c0 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
117d0 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
117e0 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
117f0 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
11800 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
11810 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
11820 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
11830 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
11840 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
11870 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
11880 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
118b0 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
118c0 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
118d0 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
118f0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
11900 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
11910 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11920 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
11930 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
11940 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
11950 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
11960 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
11970 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
11980 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
11990 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
119a0 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
119b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
119c0 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
119d0 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
119e0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
119f0 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
11a00 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
11a10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11a20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
11a30 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
11a40 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
11a50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11a60 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
11a70 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
11a80 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
11a90 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
11aa0 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
11ab0 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
11ac0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11ad0 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
11ae0 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
11af0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
11b00 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
11b10 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
11b20 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
11b30 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
11b40 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
11b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
11b60 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
11b70 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
11b80 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
11b90 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
11ba0 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
11bb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
11bc0 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
11bd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
11be0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
11bf0 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
11c00 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
11c10 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
11c20 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
11c30 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
11c40 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
11c50 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
11c60 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
11c70 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
11c80 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
11c90 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
11ca0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
11cb0 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
11cc0 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
11cd0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nsaction.       
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
11cf0 68 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74  hat are candidat
11d00 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61  es for a two-pha
11d10 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20  se commit using 
11d20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
11d30 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a       ** master-j
11d40 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
11d50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11d60 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
11d70 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
11d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11d90 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
11da0 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
11db0 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
11dc0 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
11dd0 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
11de0 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
11df0 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
11e00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11e10 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
11e20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
11e30 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
11e40 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
11e50 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
11e60 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
11e70 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
11e80 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
11e90 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
11ea0 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
11eb0 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
11ec0 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
11ed0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ee0 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
11ef0 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
11f00 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
11f10 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
11f20 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
11f30 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
11f40 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
11f50 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
11f60 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54  (db, p);..  /* T
11f70 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
11f80 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
11f90 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
11fa0 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
11fb0 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
11fc0 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
11fd0 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
11fe0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
11ff0 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
12000 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
12010 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
12020 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
12030 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
12040 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
12050 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
12060 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
12070 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
12080 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
12090 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
120a0 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
120b0 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
120c0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
120d0 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
120e0 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
120f0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
12100 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
12110 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
12120 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
12130 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20    /* Whether or 
12140 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d  not a database m
12150 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74  ight need a mast
12160 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e  er journal depen
12170 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a  ds upon.      **
12180 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   its journal mod
12190 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74  e (among other t
121a0 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61  hings).  This ma
121b0 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20  trix determines 
121c0 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a  which.      ** j
121d0 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65  ournal modes use
121e0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
121f0 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e  l and which do n
12200 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  ot */.      stat
12210 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e  ic const u8 aMJN
12220 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  eeded[] = {.    
12230 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20      /* DELETE   
12240 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f  */  1,.        /
12250 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31  * PERSIST   */ 1
12260 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  ,.        /* OFF
12270 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20         */ 0,.   
12280 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45       /* TRUNCATE
12290 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20    */ 1,.        
122a0 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20  /* MEMORY    */ 
122b0 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41  0,.        /* WA
122c0 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20  L       */ 0.   
122d0 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65     };.      Page
122e0 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20  r *pPager;   /* 
122f0 50 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  Pager associated
12300 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20   with pBt */.   
12310 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
12320 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
12330 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
12340 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d  ;.      pPager =
12350 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
12360 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  er(pBt);.      i
12370 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61  f( db->aDb[i].sa
12380 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45  fety_level!=PAGE
12390 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
123a0 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e  F.       && aMJN
123b0 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67  eeded[sqlite3Pag
123c0 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
123d0 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20  (pPager)].      
123e0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
123f0 49 73 4d 65 6d 64 62 28 70 50 61 67 65 72 29 3d  IsMemdb(pPager)=
12400 3d 30 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20  =0.      ){ .   
12410 20 20 20 20 20 61 73 73 65 72 74 28 20 69 21 3d       assert( i!=
12420 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72  1 );.        nTr
12430 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ans++;.      }. 
12440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12450 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
12460 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
12470 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
12480 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  eave(pBt);.    }
12490 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
124a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
124b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
124c0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
124d0 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
124e0 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
124f0 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
12500 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
12510 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
12520 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
12530 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
12540 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
12550 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
12560 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
12570 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12580 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
12590 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
125a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
125b0 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
125c0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
125d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
125e0 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
125f0 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
12600 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
12610 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
12620 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
12630 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
12640 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
12650 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
12660 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
12670 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
12680 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
12690 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
126a0 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
126b0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
126c0 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
126d0 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
126e0 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
126f0 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
12700 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
12710 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
12720 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
12730 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
12740 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
12750 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
12760 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
12770 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
12780 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
12790 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
127a0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
127b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
127c0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
127d0 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
127e0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
127f0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12800 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
12810 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12820 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
12830 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
12840 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
12850 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
12860 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
12870 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
12880 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
12890 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
128a0 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
128b0 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
128c0 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
128d0 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
128e0 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
128f0 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
12900 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
12910 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
12920 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
12930 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
12940 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
12950 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
12960 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
12970 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
12980 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
12990 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
129a0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
129b0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
129c0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
129d0 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
129e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
129f0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12a00 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
12a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12a20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
12a40 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
12a50 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
12a60 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
12a70 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
12a80 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
12a90 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
12aa0 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
12ab0 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
12ac0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12ad0 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
12ae0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
12af0 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
12b00 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23  omically..  */.#
12b10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12b20 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
12b30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
12b40 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
12b50 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  fs;.    char *zM
12b60 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
12b70 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
12b80 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12b90 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
12ba0 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
12bb0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
12bc0 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
12bd0 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
12be0 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
12bf0 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
12c00 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
12c10 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
12c20 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
12c30 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
12c40 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
12c50 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
12c60 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
12c70 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
12c80 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
12c90 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
12ca0 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
12cb0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
12cc0 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
12cd0 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
12ce0 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
12cf0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12d00 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
12d10 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
12d20 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66  Random;.      if
12d30 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a  ( retryCount ){.
12d40 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
12d50 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20  yCount>100 ){.  
12d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12d70 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
12d80 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22   "MJ delete: %s"
12d90 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
12db0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
12dc0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
12dd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12de0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72    }else if( retr
12df0 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  yCount==1 ){.   
12e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
12e10 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
12e20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22  "MJ collide: %s"
12e30 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12e40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12e50 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b      retryCount++
12e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12e70 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
12e80 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
12e90 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ndom);.      sql
12ea0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33  ite3_snprintf(13
12eb0 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e  , &zMaster[nMain
12ec0 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39  File], "-mj%06X9
12ed0 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20  %02X",.         
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ef0 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e        (iRandom>>
12f00 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61  8)&0xffffff, iRa
12f10 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20  ndom&0xff);.    
12f20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e    /* The antipen
12f30 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74  ultimate charact
12f40 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  er of the master
12f50 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
12f60 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22  st.      ** be "
12f70 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65  9" to avoid name
12f80 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e   collisions when
12f90 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e   using 8+3 filen
12fa0 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ames. */.      a
12fb0 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73  ssert( zMaster[s
12fc0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12fd0 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20  Master)-3]=='9' 
12fe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12ff0 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69  FileSuffix3(zMai
13000 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b  nFile, zMaster);
13010 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13020 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
13030 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
13040 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
13050 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
13060 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
13070 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
13080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13090 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
130a0 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
130b0 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
130c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
130d0 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
130e0 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
130f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
13100 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13110 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
13120 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
13130 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
13140 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
13150 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
13160 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
13170 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
13180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13190 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
131a0 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
131b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
131c0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
131d0 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
131e0 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
131f0 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
13200 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
13210 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
13220 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
13230 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13240 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
13250 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
13260 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
13270 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13280 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
13290 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
132a0 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
132b0 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
132c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
132d0 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
132e0 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
132f0 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
13300 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
13310 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
13320 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
13330 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
13340 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
13350 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
13360 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
13370 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
13380 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
13390 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
133a0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
133b0 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
133c0 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
133d0 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
133e0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
133f0 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
13400 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
13410 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
13420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13430 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
13440 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
13450 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
13460 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
13470 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
13480 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
13490 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
134a0 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
134b0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
134c0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
134d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
134e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
134f0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
13500 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
13510 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
13520 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
13530 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
13540 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13550 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
13560 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13580 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
13590 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
135a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
135b0 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
135c0 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
135d0 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
135e0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
135f0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
13600 69 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f  if( 0==(sqlite3O
13610 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
13620 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
13630 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
13640 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
13650 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
13660 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
13670 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
13680 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
13690 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
136a0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
136b0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
136c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
136d0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
136e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
136f0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
13700 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13710 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
13720 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
13730 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
13740 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
13750 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
13760 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
13770 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13780 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
13790 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
137a0 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
137b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
137c0 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
137d0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
137e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
137f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
13800 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
13810 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
13820 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
13830 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
13840 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
13850 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
13860 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
13870 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
13880 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
13890 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
138a0 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
138b0 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
138c0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
138d0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
138e0 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
138f0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
13900 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
13910 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
13920 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
13930 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
13940 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
13950 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
13960 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
13970 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
13980 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
13990 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
139a0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
139b0 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
139c0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
139d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
139e0 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
139f0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
13a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
13a10 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
13a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13a30 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13a40 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
13a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13a60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
13a70 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
13a80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
13a90 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
13aa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
13ab0 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
13ac0 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
13ad0 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
13ae0 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
13af0 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
13b00 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
13b10 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
13b20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
13b30 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
13b40 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
13b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
13b60 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
13b70 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
13b80 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
13b90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13ba0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13bb0 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
13bc0 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
13bd0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
13be0 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
13bf0 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
13c00 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
13c10 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
13c20 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
13c30 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
13c40 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
13c50 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
13c60 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
13c70 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
13c80 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
13c90 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
13ca0 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
13cb0 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
13cc0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
13cd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
13ce0 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
13cf0 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
13d00 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
13d10 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
13d20 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
13d30 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
13d40 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
13d50 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
13d60 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
13d70 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
13d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
13d90 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
13da0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13db0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
13dc0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
13dd0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
13de0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
13df0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
13e00 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
13e10 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b  haseTwo(pBt, 1);
13e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13e30 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
13e40 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
13e50 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
13e60 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
13e70 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
13e80 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
13e90 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
13ea0 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
13eb0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
13ec0 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
13ed0 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63  e3.nVdbeActive c
13ee0 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
13ef0 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
13f00 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
13f10 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
13f20 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
13f30 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
13f40 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
13f50 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
13f60 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
13f70 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
13f80 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
13f90 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
13fa0 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
13fb0 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
13fc0 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
13fd0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
13fe0 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
13ff0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
14000 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
14010 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
14020 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
14030 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
14040 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
14050 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
14060 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20   0;.  int nRead 
14070 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
14080 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
14090 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
140a0 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73  te3_stmt_busy((s
140b0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20  qlite3_stmt*)p) 
140c0 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
140d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61        if( p->rea
140e0 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74  dOnly==0 ) nWrit
140f0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
14100 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52  ->bIsReader ) nR
14110 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ead++;.    }.   
14120 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
14130 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
14140 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ==db->nVdbeActiv
14150 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
14160 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65  Write==db->nVdbe
14170 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72  Write );.  asser
14180 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56  t( nRead==db->nV
14190 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c  dbeRead );.}.#el
141a0 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
141b0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
141c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
141d0 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  f the Vdbe passe
141e0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
141f0 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61  rgument opened a
14200 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
14210 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65  action,.** close
14220 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e   it now. Argumen
14230 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69  t eOp must be ei
14240 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
14250 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41  OLLBACK or.** SA
14260 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
14270 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
14280 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
14290 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
142a0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
142b0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
142c0 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f  If eOp is SAVEPO
142d0 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
142e0 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d  n the .** statem
142f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
14300 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
14310 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
14320 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
14330 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
14340 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14350 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
14360 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
14370 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
14380 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64  _NOINLINE int vd
14390 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
143a0 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
143b0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
143c0 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
143d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
143e0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
143f0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76    const int iSav
14400 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61  epoint = p->iSta
14410 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73  tement-1;..  ass
14420 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
14430 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
14440 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
14450 45 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72  ELEASE);.  asser
14460 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
14470 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
14480 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
14490 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
144a0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
144b0 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
144c0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
144d0 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53  .    int rc2 = S
144e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74  QLITE_OK;.    Bt
144f0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
14500 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
14510 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
14520 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
14530 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
14540 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
14550 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
14560 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
14570 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
14580 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
14590 0a 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d  .      if( rc2==
145a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
145b0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
145c0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
145d0 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
145e0 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
145f0 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
14600 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14620 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
14630 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64   }.    }.  }.  d
14640 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
14650 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
14660 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d   = 0;..  if( rc=
14670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14680 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
14690 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
146a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
146b0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
146c0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
146d0 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
146e0 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
146f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14700 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
14710 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
14720 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
14730 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
14740 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
14750 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
14760 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14770 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
14780 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
14790 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
147a0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
147b0 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
147c0 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
147d0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
147e0 68 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74  had when .  ** t
147f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
14800 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
14810 6e 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65  ned.  */.  if( e
14820 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
14830 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62  LLBACK ){.    db
14840 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
14850 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
14860 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  s;.    db->nDefe
14870 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
14880 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
14890 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
148a0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
148b0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
148c0 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
148d0 65 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64  eOp){.  if( p->d
148e0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
148f0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
14900 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 76 64 62  {.    return vdb
14910 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14920 70 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72  p, eOp);.  }.  r
14930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14940 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
14950 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
14960 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
14970 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
14980 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
14990 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
149a0 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
149b0 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
149c0 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
149d0 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
149e0 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
149f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
14a00 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
14a10 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
14a20 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
14a30 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
14a40 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
14a50 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
14a60 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
14a70 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
14a80 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
14a90 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
14aa0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
14ab0 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
14ac0 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
14ad0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
14ae0 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77  EIGNKEY.** and w
14af0 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
14b00 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
14b10 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
14b20 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
14b30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
14b40 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
14b50 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
14b60 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
14b70 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
14b80 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
14b90 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
14ba0 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65  && (db->nDeferre
14bb0 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72  dCons+db->nDefer
14bc0 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a  redImmCons)>0) .
14bd0 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64     || (!deferred
14be0 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
14bf0 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20  aint>0) .  ){.  
14c00 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14c10 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
14c20 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65  IGNKEY;.    p->e
14c30 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
14c40 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  Abort;.    sqlit
14c50 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
14c60 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
14c70 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
14c80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14c90 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14cb0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
14cc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14cd0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
14ce0 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
14cf0 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
14d00 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
14d10 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
14d20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
14d30 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
14d40 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
14d50 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
14d60 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
14d70 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
14d80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
14d90 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
14da0 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
14db0 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
14dc0 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
14dd0 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
14de0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
14df0 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
14e00 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
14e10 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
14e20 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
14e30 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
14e40 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
14e50 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
14e60 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
14e70 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
14e80 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
14e90 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
14ea0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
14eb0 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
14ec0 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
14ed0 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
14ee0 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
14ef0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
14f00 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
14f10 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
14f20 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
14f30 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14f50 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
14f60 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
14f70 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
14f80 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
14f90 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
14fa0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
14fb0 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
14fc0 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
14fd0 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
14fe0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
14ff0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
15000 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
15010 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
15020 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
15030 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
15040 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
15050 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
15060 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
15070 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
15080 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
15090 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
150a0 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
150b0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
150c0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
150d0 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
150e0 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
150f0 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
15100 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
15110 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
15120 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
15130 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
15140 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
15150 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
15160 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
15170 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
15180 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
15190 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
151a0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
151b0 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
151c0 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
151d0 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
151e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
151f0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  K;.  }.  if( db-
15200 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
15210 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
15220 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
15230 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
15240 72 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63  rsors(p);.  chec
15250 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
15260 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
15270 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
15280 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
15290 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
152a0 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20  ted or if the.  
152b0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
152c0 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f   does not read o
152d0 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61  r write a databa
152e0 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69  se file.  */.  i
152f0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70  f( p->pc>=0 && p
15300 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20  ->bIsReader ){. 
15310 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
15320 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
15330 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
15340 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  /.    int eState
15350 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20  mentOp = 0;.    
15360 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
15370 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
15380 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
15390 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72   a 'special' err
153a0 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  or */..    /* Lo
153b0 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
153c0 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
153d0 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
153e0 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
153f0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
15400 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
15410 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
15420 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
15430 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
15440 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
15450 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
15460 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
15470 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
15480 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
15490 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
154a0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
154b0 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
154c0 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
154d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
154e0 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
154f0 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
15500 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
15510 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
15520 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
15530 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
15540 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
15550 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
15560 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
15570 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
15580 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
15590 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
155a0 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
155b0 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
155c0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
155d0 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
155e0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
155f0 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
15600 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
15610 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
15620 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
15630 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
15640 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
15650 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
15660 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  ** occurred whil
15670 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
15680 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
15690 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
156a0 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
156b0 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
156c0 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
156d0 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
156e0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
156f0 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
15700 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
15710 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
15720 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
15730 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
15740 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
15750 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
15760 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
15770 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
15780 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
15790 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
157a0 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
157b0 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
157c0 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
157d0 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
157e0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
157f0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
15800 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15810 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
15820 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
15830 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
15840 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
15850 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
15860 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
15870 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
15880 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
15890 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
158a0 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
158b0 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
158c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
158d0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
158e0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
158f0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
15900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
15910 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
15920 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
15930 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
15940 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
15950 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
15960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15970 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
15980 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
15990 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
159a0 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
159b0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
159c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
159d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
159e0 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
159f0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
15a00 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
15a10 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
15a20 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
15a30 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
15a40 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
15a50 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
15a60 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
15a70 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
15a80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
15a90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
15aa0 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
15ab0 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
15ac0 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
15ad0 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
15ae0 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
15af0 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
15b00 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
15b10 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
15b20 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
15b30 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
15b40 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d  db->nVdbeWrite==
15b50 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
15b60 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
15b70 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15b80 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
15b90 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
15ba0 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
15bb0 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  or) ){.        r
15bc0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
15bd0 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20  heckFk(p, 1);.  
15be0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15c00 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70       if( NEVER(p
15c10 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
15c20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15c30 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
15c40 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
15c50 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
15c60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15c70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15c80 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
15c90 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20  REIGNKEY;.      
15ca0 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20    }else{ .      
15cb0 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
15cc0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
15cd0 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72  rue, the vdbe pr
15ce0 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73  ogram was succes
15cf0 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20  sful .          
15d00 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ** or hit an 'OR
15d10 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
15d20 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  t and there are 
15d30 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  no deferred fore
15d40 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ign.          **
15d50 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
15d60 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20   to hold up the 
15d70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
15d80 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
15d90 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
15da0 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  s required. */. 
15db0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
15dc0 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b  beCommit(db, p);
15dd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15de0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15df0 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61  E_BUSY && p->rea
15e00 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
15e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
15e20 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
15e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15e40 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
15e50 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
15e60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15e70 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
15e80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15e90 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
15ea0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
15eb0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
15ec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
15ed0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
15ee0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
15ef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15f00 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
15f10 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
15f20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
15f30 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f 44 65   ~(u64)SQLITE_De
15f40 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
15f50 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
15f60 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
15f70 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
15f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15f90 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
15fa0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
15fb0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  _OK);.        p-
15fc0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
15fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
15fe0 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
15ff0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
16000 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
16010 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
16020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
16030 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
16040 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
16050 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
16060 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
16070 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
16080 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
16090 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
160a0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
160b0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
160c0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
160d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
160e0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
160f0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
16100 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
16110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
16120 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
16130 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
16140 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
16150 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
16160 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
16170 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
16180 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
16190 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
161a0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
161b0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
161c0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
161d0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
161e0 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
161f0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
16200 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
16210 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
16220 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
16230 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
16240 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
16250 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
16260 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
16270 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
16280 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
16290 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
162a0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
162b0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
162c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
162d0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
162e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
162f0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
16300 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
16310 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
16320 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
16330 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16340 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
16350 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
16360 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
16370 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
16380 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16390 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
163a0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
163b0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
163c0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
163d0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
163e0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
163f0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
16400 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
16410 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
16420 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
16430 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
16440 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
16450 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
16460 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
16470 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
16480 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
16490 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
164a0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
164b0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
164c0 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
164d0 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
164e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
164f0 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
16500 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
16510 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
16520 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
16530 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
16540 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
16550 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
16560 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
16570 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
16580 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
16590 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
165a0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
165b0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
165c0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
165d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
165e0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
165f0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
16600 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
16610 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
16620 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
16630 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
16640 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
16650 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
16660 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
16670 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
16680 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
16690 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
166a0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
166b0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
166c0 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
166d0 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
166e0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
166f0 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
16700 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
16710 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
16720 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
16730 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
16740 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
16750 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
16760 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
16770 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
16780 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
16790 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
167a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
167b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
167c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
167d0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
167e0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
167f0 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
16800 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
16810 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
16820 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
16830 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
16840 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
16850 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
16860 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
16870 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
16880 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
16890 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
168a0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
168b0 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
168c0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
168d0 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
168e0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
168f0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
16900 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
16910 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
16920 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
16930 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
16940 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
16950 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
16960 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
16970 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
16980 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
16990 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
169a0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
169b0 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
169c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
169d0 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
169e0 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
169f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16a00 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
16a10 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
16a20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
16a30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
16a40 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
16a50 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
16a60 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
16a70 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
16a80 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
16a90 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
16aa0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16ab0 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
16ac0 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
16ad0 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
16ae0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
16af0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
16b00 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
16b10 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
16b20 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
16b30 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
16b40 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
16b50 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
16b60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
16b70 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
16b80 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
16b90 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
16ba0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16bb0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
16bc0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
16bd0 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
16be0 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
16bf0 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  loc++;.    sqlit
16c00 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
16c10 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
16c20 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
16c30 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
16c40 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
16c50 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
16c60 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
16c70 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
16c80 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
16c90 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
16ca0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
16cb0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
16cc0 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f  db->bBenignMallo
16cd0 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c--;.  }else if(
16ce0 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20   db->pErr ){.   
16cf0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
16d00 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Null(db->pErr);.
16d10 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64    }.  db->errCod
16d20 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  e = rc;.  return
16d30 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
16d40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
16d50 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  LOG./*.** If an 
16d60 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
16d70 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67  LLOG hook is reg
16d80 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20  istered and the 
16d90 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c  VM has been run,
16da0 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a   .** invoke it..
16db0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
16dc0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
16dd0 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
16de0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16df0 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76  fig.xSqllog && v
16e00 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16e10 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d  && v->zSql && v-
16e20 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68  >pc>=0 ){.    ch
16e30 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20  ar *zExpanded = 
16e40 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e  sqlite3VdbeExpan
16e50 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29  dSql(v, v->zSql)
16e60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d  ;.    assert( v-
16e70 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d  >db->init.busy==
16e80 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78  0 );.    if( zEx
16e90 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20  panded ){.      
16ea0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16eb0 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20  fig.xSqllog(.   
16ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
16ed0 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
16ee0 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45  ogArg, v->db, zE
16ef0 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20  xpanded, 1.     
16f00 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16f10 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a  3DbFree(v->db, z
16f20 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d  Expanded);.    }
16f30 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
16f40 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65  efine vdbeInvoke
16f50 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66  Sqllog(x).#endif
16f60 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
16f70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
16f80 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
16f90 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
16fa0 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
16fb0 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
16fc0 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
16fd0 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
16fe0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
16ff0 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
17000 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
17010 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
17020 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
17030 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
17040 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
17050 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
17060 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
17070 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
17080 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
17090 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
170a0 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
170b0 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
170c0 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
170d0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
170e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
170f0 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
17100 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
17110 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
17120 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
17130 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
17140 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
17150 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
17160 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
17170 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
17180 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
17190 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
171a0 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
171b0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
171c0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
171d0 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
171e0 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
171f0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
17200 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
17210 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
17220 45 20 68 61 73 20 62 65 65 6e 20 72 75 6e 20 65  E has been run e
17230 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
17240 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
17250 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
17260 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
17270 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
17280 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
17290 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
172a0 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
172b0 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
172c0 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
172d0 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
172e0 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
172f0 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
17300 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
17310 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
17320 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
17330 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
17340 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
17350 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49  >=0 ){.    vdbeI
17360 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a  nvokeSqllog(p);.
17370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
17380 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b  ransferError(p);
17390 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
173a0 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
173b0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
173c0 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
173d0 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
173e0 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
173f0 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
17400 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
17410 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
17420 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
17430 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
17440 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
17450 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
17460 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
17470 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
17480 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
17490 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
174a0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
174b0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
174c0 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72  b, p->rc, p->zEr
174d0 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
174e0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
174f0 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 72 65  }..  /* Reset re
17500 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 73 20  gister contents 
17510 61 6e 64 20 72 65 63 6c 61 69 6d 20 65 72 72 6f  and reclaim erro
17520 72 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72 79  r message memory
17530 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
17540 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
17550 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
17560 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
17570 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
17580 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
17590 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
175a0 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
175b0 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
175c0 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28  ed up.  */.  if(
175d0 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
175e0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
175f0 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
17600 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
17610 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
17620 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
17630 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  i<p->nMem; i++) 
17640 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
17650 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e  i].flags==MEM_Un
17660 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  defined );.  }.#
17670 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
17680 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
17690 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
176a0 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
176b0 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 23 69  esultSet = 0;.#i
176c0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
176d0 47 0a 20 20 70 2d 3e 6e 57 72 69 74 65 20 3d 20  G.  p->nWrite = 
176e0 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  0;.#endif..  /* 
176f0 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
17700 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
17710 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
17720 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
17730 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
17740 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
17750 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
17760 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
17770 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
17780 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
17790 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
177a0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
177b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
177c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
177d0 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
177e0 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
177f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
17800 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69  , "\n");.      i
17810 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
17820 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63        char c, pc
17830 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70   = 0;.        fp
17840 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
17850 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
17860 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c  =0; (c = p->zSql
17870 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
17880 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d           if( pc=
17890 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
178a0 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
178b0 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f         putc(c, o
178c0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
178d0 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d  c = c;.        }
178e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21  .        if( pc!
178f0 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
17900 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
17910 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
17920 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
17930 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
17940 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zHdr[100];.     
17950 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
17960 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29  ntf(sizeof(zHdr)
17970 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32  , zHdr, "%6u %12
17980 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20  llu %8llu ",.   
17990 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
179a0 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
179b0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
179c0 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
179d0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
179e0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
179f0 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
17a00 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
17a10 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
17a20 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b  ut, "%s", zHdr);
17a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17a40 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
17a50 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
17a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
17a70 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
17a80 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
17a90 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
17aa0 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65  AGIC_RESET;.  re
17ab0 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
17ac0 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
17ad0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
17ae0 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
17af0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
17b00 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
17b10 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
17b20 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
17b30 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
17b40 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
17b50 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
17b60 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
17b70 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
17b80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17b90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
17ba0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
17bb0 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
17bc0 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
17bd0 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
17be0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
17bf0 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
17c00 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
17c10 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
17c20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
17c30 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
17c40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17c50 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f   If parameter iO
17c60 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  p is less than z
17c70 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ero, then invoke
17c80 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
17c90 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c  for.** all auxil
17ca0 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
17cb0 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  rs currently cac
17cc0 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  hed by the VM pa
17cd0 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66  ssed as.** the f
17ce0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
17cf0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20  *.** Or, if iOp 
17d00 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
17d10 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
17d20 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72  , then the destr
17d30 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79  uctor is.** only
17d40 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f   invoked for tho
17d50 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  se auxiliary dat
17d60 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74  a pointers creat
17d70 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a  ed by the user .
17d80 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  ** function invo
17d90 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75  ked by the OP_Fu
17da0 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74  nction opcode at
17db0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70   instruction iOp
17dc0 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65   of .** VM pVdbe
17dd0 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20  , and only then 
17de0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  if:.**.**    * t
17df0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75  he associated fu
17e00 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
17e10 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20   is the 32nd or 
17e20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a  later (counting.
17e30 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66  **      from lef
17e40 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a  t to right), or.
17e50 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63  **.**    * the c
17e60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
17e70 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
17e80 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72  k is clear (wher
17e90 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  e the first.**  
17ea0 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72      function par
17eb0 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e  ameter correspon
17ec0 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e  ds to bit 0 etc.
17ed0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
17ee0 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
17ef0 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ata(sqlite3 *db,
17f00 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69   AuxData **pp, i
17f10 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b  nt iOp, int mask
17f20 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20  ){.  while( *pp 
17f30 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a  ){.    AuxData *
17f40 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20  pAux = *pp;.    
17f50 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20  if( (iOp<0).    
17f60 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75 78 4f   || (pAux->iAuxO
17f70 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20 20 20  p==iOp.         
17f80 20 26 26 20 70 41 75 78 2d 3e 69 41 75 78 41 72   && pAux->iAuxAr
17f90 67 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  g>=0.          &
17fa0 26 20 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67  & (pAux->iAuxArg
17fb0 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
17fc0 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
17fd0 69 41 75 78 41 72 67 29 29 29 29 0a 20 20 20 20  iAuxArg)))).    
17fe0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
17ff0 65 28 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67  e( pAux->iAuxArg
18000 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ==31 );.      if
18010 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41  ( pAux->xDeleteA
18020 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  ux ){.        pA
18030 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 28 70  ux->xDeleteAux(p
18040 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
18050 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
18060 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a  pAux->pNextAux;.
18070 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
18080 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20  ree(db, pAux);. 
18090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
180a0 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
180b0 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Aux;.    }.  }.}
180c0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
180d0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
180e0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
180f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
18100 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
18110 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
18120 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
18130 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
18140 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
18150 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
18160 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
18170 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
18180 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
18190 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
181a0 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
181b0 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
181c0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
181d0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
181e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
181f0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
18200 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
18210 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
18220 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
18230 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
18240 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
18250 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
18260 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
18270 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
18280 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
18290 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
182a0 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
182b0 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
182c0 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
182d0 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
182e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
182f0 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
18300 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
18310 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
18320 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
18330 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18340 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
18350 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
18360 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
18370 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
18380 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
18390 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73   p->nVar);.    s
183a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
183b0 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20   p->pVList);.   
183c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
183d0 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20  b, p->pFree);.  
183e0 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  }.  vdbeFreeOpAr
183f0 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
18400 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
18410 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
18420 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
18430 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18440 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20  ->zSql);.#ifdef 
18450 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f  SQLITE_ENABLE_NO
18460 52 4d 41 4c 49 5a 45 0a 20 20 73 71 6c 69 74 65  RMALIZE.  sqlite
18470 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
18480 4e 6f 72 6d 53 71 6c 29 3b 0a 20 20 7b 0a 20 20  NormSql);.  {.  
18490 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20 2a 70    DblquoteStr *p
184a0 54 68 69 73 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  This, *pNext;.  
184b0 20 20 66 6f 72 28 70 54 68 69 73 3d 70 2d 3e 70    for(pThis=p->p
184c0 44 62 6c 53 74 72 3b 20 70 54 68 69 73 3b 20 70  DblStr; pThis; p
184d0 54 68 69 73 3d 70 4e 65 78 74 29 7b 0a 20 20 20  This=pNext){.   
184e0 20 20 20 70 4e 65 78 74 20 3d 20 70 54 68 69 73     pNext = pThis
184f0 2d 3e 70 4e 65 78 74 53 74 72 3b 0a 20 20 20 20  ->pNextStr;.    
18500 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18510 64 62 2c 20 70 54 68 69 73 29 3b 0a 20 20 20 20  db, pThis);.    
18520 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  }.  }.#endif.#if
18530 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18540 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
18550 53 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  S.  {.    int i;
18560 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18570 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a  p->nScan; i++){.
18580 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
18590 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
185a0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
185b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
185c0 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
185d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
185e0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
185f0 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
18600 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18610 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
18620 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18630 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
18640 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
18650 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
18660 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
18670 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
18680 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
18690 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20  bject(db, p);.  
186a0 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
186b0 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
186c0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
186d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
186e0 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d  ert( db->pVdbe==
186f0 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64  p );.    db->pVd
18700 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
18710 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
18720 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
18730 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
18740 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  rev;.  }.  p->ma
18750 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
18760 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d  _DEAD;.  p->db =
18770 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
18780 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  reeNN(db, p);.}.
18790 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
187a0 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64  r "p" has a pend
187b0 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69  ing seek operati
187c0 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
187d0 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72  yet been.** carr
187e0 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74  ied out.  Seek t
187f0 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20  he cursor now.  
18800 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
18810 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  rs, return.** th
18820 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
18830 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
18840 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
18850 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65  OINLINE handleDe
18860 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62  ferredMoveto(Vdb
18870 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
18880 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
18890 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
188a0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
188b0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
188c0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
188d0 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  t( p->deferredMo
188e0 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  veto );.  assert
188f0 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
18900 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
18910 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
18920 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73  TREE );.  rc = s
18930 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
18940 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e  oUnpacked(p->uc.
18950 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
18960 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
18970 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
18980 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
18990 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
189a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
189b0 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53  T_BKPT;.#ifdef S
189c0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
189d0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
189e0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d  t++;.#endif.  p-
189f0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
18a00 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  = 0;.  p->cacheS
18a10 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
18a20 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ALE;.  return SQ
18a30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18a40 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
18a50 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22  moved cursor "p"
18a60 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20   out of place.  
18a70 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74  Maybe the row it
18a80 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20   was.** pointed 
18a90 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f  to was deleted o
18aa0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74  ut from under it
18ab0 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20  .  Or maybe the 
18ac0 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62  btree was.** reb
18ad0 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76  alanced.  Whatev
18ae0 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72  er the cause, tr
18af0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22  y to restore "p"
18b00 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74   to the place it
18b10 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20  .** is supposed 
18b20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20  to be pointing. 
18b30 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20   If the row was 
18b40 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
18b50 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75   under the.** cu
18b60 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75  rsor, set the cu
18b70 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
18b80 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a   a NULL row..*/.
18b90 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
18ba0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
18bb0 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62  eMovedCursor(Vdb
18bc0 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
18bd0 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  nt isDifferentRo
18be0 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  w, rc;.  assert(
18bf0 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
18c00 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
18c10 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70   assert( p->uc.p
18c20 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
18c30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
18c40 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
18c50 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
18c60 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
18c70 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
18c80 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73  tore(p->uc.pCurs
18c90 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74  or, &isDifferent
18ca0 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65  Row);.  p->cache
18cb0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
18cc0 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69  TALE;.  if( isDi
18cd0 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e  fferentRow ) p->
18ce0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
18cf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18d00 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75  ** Check to ensu
18d10 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
18d20 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65  or is valid.  Re
18d30 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
18d40 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20  .** if need be. 
18d50 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20   Return any I/O 
18d60 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72  error from the r
18d70 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e  estore operation
18d80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18d90 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
18da0 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  e(VdbeCursor *p)
18db0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  {.  assert( p->e
18dc0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
18dd0 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20  _BTREE );.  if( 
18de0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
18df0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
18e00 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
18e10 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
18e20 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
18e30 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
18e40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
18e50 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
18e60 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
18e70 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
18e80 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
18e90 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
18ea0 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
18eb0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
18ec0 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
18ed0 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
18ee0 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
18ef0 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
18f00 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
18f10 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
18f20 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
18f30 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
18f40 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
18f50 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
18f60 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
18f70 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
18f80 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
18f90 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
18fa0 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
18fb0 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
18fc0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
18fd0 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
18fe0 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
18ff0 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
19000 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
19010 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
19020 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
19030 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
19040 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
19050 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
19060 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
19070 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
19080 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
19090 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
190a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
190b0 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
190c0 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20  dbeCursor **pp, 
190d0 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56  int *piCol){.  V
190e0 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a  dbeCursor *p = *
190f0 70 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  pp;.  assert( p-
19100 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
19110 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65  PE_BTREE || p->e
19120 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
19130 5f 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28  _PSEUDO );.  if(
19140 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
19150 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  to ){.    int iM
19160 61 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  ap;.    if( p->a
19170 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20  AltMap && (iMap 
19180 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a  = p->aAltMap[1+*
19190 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20  piCol])>0 ){.   
191a0 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74     *pp = p->pAlt
191b0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70  Cursor;.      *p
191c0 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b  iCol = iMap - 1;
191d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
191e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
191f0 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
19200 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70  DeferredMoveto(p
19210 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
19220 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
19230 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
19240 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
19250 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
19260 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
19270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19280 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
19290 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
192a0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
192b0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
192c0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
192d0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
192e0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
192f0 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
19300 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
19310 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
19320 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
19330 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
19340 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
19350 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
19360 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
19370 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
19380 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
19390 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
193a0 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
193b0 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
193c0 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
193d0 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
193e0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
193f0 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
19400 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
19410 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
19420 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
19430 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
19440 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
19450 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
19460 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
19470 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
19480 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
19490 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
194a0 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
194b0 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
194c0 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
194d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
194e0 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
194f0 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
19500 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
19510 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
19520 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
19530 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
19540 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
19550 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
19560 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  arately..**.** T
19570 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
19580 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
19590 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
195a0 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
195b0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
195c0 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
195d0 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
195e0 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
195f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
19600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
19610 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
19620 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
19640 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
19650 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
19670 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
19680 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
19690 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
196a0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
196b0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
196c0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
196f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
19700 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
19720 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
19730 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
19740 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
19750 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
19760 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
19770 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
197a0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
197b0 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
197c0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
197d0 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
197e0 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
19810 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
19820 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
19840 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
19850 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
19860 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
19890 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
198a0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
198b0 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
198c0 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
198d0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
198e0 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
198f0 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
19900 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
19910 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
19920 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
19930 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
19940 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
19950 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
19960 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
19970 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
19980 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
19990 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
199a0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
199b0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
199c0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
199d0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
199e0 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
199f0 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70  e_format, u32 *p
19a00 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  Len){.  int flag
19a10 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
19a20 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73  .  u32 n;..  ass
19a30 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a  ert( pLen!=0 );.
19a40 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
19a50 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Null ){.    *pLe
19a60 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  n = 0;.    retur
19a70 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
19a80 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
19a90 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
19aa0 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
19ab0 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
19ac0 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
19ad0 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
19ae0 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
19af0 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
19b00 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
19b10 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
19b20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
19b30 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d     u = ~i;.    }
19b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
19b50 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
19b60 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
19b70 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26   if( (i&1)==i &&
19b80 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
19b90 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e  ){.        *pLen
19ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
19bb0 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20  turn 8+(u32)u;. 
19bc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19bd0 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20      *pLen = 1;. 
19be0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19bf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19c00 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
19c10 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65  ){ *pLen = 2; re
19c20 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66  turn 2; }.    if
19c30 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20  ( u<=8388607 ){ 
19c40 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72  *pLen = 3; retur
19c50 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 3; }.    if( u
19c60 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20  <=2147483647 ){ 
19c70 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72  *pLen = 4; retur
19c80 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 4; }.    if( u
19c90 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a  <=MAX_6BYTE ){ *
19ca0 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e  pLen = 6; return
19cb0 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20   5; }.    *pLen 
19cc0 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 8;.    return 
19cd0 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
19ce0 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
19cf0 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
19d00 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
19d10 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
19d20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19d30 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
19d40 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
19d50 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
19d60 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75  n>=0 );.  n = (u
19d70 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66  32)pMem->n;.  if
19d80 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
19d90 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
19da0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
19db0 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20  }.  *pLen = n;. 
19dc0 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
19dd0 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
19de0 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
19df0 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20  /*.** The sizes 
19e00 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73  for serial types
19e10 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a   less than 128.*
19e20 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
19e30 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  8 sqlite3SmallTy
19e40 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20  peSizes[] = {.  
19e50 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20        /*  0   1 
19e60 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20    2   3   4   5 
19e70 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20    6   7   8   9 
19e80 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20  */   ./*   0 */ 
19e90 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
19ea0 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c    4,  6,  8,  8,
19eb0 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20    0,  0,./*  10 
19ec0 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
19ed0 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20   0,  1,  1,  2, 
19ee0 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20   2,  3,  3,./*  
19ef0 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20  20 */   4,  4,  
19f00 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20  5,  5,  6,  6,  
19f10 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f  7,  7,  8,  8,./
19f20 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39  *  30 */   9,  9
19f30 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31  , 10, 10, 11, 11
19f40 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33  , 12, 12, 13, 13
19f50 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c  ,./*  40 */  14,
19f60 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c   14, 15, 15, 16,
19f70 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c   16, 17, 17, 18,
19f80 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20   18,./*  50 */  
19f90 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20  19, 19, 20, 20, 
19fa0 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20  21, 21, 22, 22, 
19fb0 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a  23, 23,./*  60 *
19fc0 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32  /  24, 24, 25, 2
19fd0 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32  5, 26, 26, 27, 2
19fe0 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37  7, 28, 28,./*  7
19ff0 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30  0 */  29, 29, 30
1a000 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32  , 30, 31, 31, 32
1a010 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a  , 32, 33, 33,./*
1a020 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c    80 */  34, 34,
1a030 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c   35, 35, 36, 36,
1a040 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c   37, 37, 38, 38,
1a050 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20  ./*  90 */  39, 
1a060 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20  39, 40, 40, 41, 
1a070 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20  41, 42, 42, 43, 
1a080 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34  43,./* 100 */  4
1a090 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34  4, 44, 45, 45, 4
1a0a0 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34  6, 46, 47, 47, 4
1a0b0 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f  8, 48,./* 110 */
1a0c0 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30    49, 49, 50, 50
1a0d0 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32  , 51, 51, 52, 52
1a0e0 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30  , 53, 53,./* 120
1a0f0 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c   */  54, 54, 55,
1a100 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c   55, 56, 56, 57,
1a110 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   57.};../*.** Re
1a120 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
1a130 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
1a140 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
1a150 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
1a160 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
1a170 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1a180 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
1a190 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
1a1a0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20  erial_type>=128 
1a1b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
1a1c0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
1a1d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1a1e0 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
1a1f0 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20  pe<12 .         
1a200 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61     || sqlite3Sma
1a210 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1a220 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61  al_type]==(seria
1a230 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29  l_type - 12)/2 )
1a240 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
1a250 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
1a260 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
1a270 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65  .  }.}.u8 sqlite
1a280 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69  3VdbeOneByteSeri
1a290 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72  alTypeLen(u8 ser
1a2a0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73  ial_type){.  ass
1a2b0 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
1a2c0 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e  <128 );.  return
1a2d0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1a2e0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1a2f0 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pe];  .}../*.** 
1a300 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
1a310 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
1a320 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
1a330 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
1a340 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
1a350 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
1a360 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
1a370 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
1a380 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
1a390 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1a3a0 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
1a3b0 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
1a3c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
1a3d0 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
1a3e0 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
1a3f0 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
1a400 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
1a410 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
1a420 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
1a430 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
1a440 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
1a450 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
1a460 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
1a470 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
1a480 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
1a490 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
1a4a0 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
1a4b0 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
1a4c0 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
1a4d0 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
1a4e0 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
1a4f0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
1a500 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
1a510 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
1a520 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
1a530 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
1a540 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
1a550 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
1a560 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
1a570 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
1a580 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
1a590 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
1a5a0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
1a5b0 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
1a5c0 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
1a5d0 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
1a5e0 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
1a5f0 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
1a600 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
1a610 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
1a620 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
1a630 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
1a640 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
1a650 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
1a660 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1a670 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
1a680 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
1a690 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
1a6a0 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
1a6b0 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
1a6c0 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
1a6d0 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
1a6e0 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
1a6f0 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
1a700 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
1a710 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
1a720 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
1a730 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
1a740 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
1a750 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
1a760 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
1a770 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
1a780 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
1a790 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
1a7a0 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
1a7b0 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
1a7c0 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
1a7d0 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
1a7e0 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
1a7f0 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
1a800 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
1a810 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
1a820 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
1a830 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
1a840 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
1a850 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
1a860 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
1a870 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
1a880 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
1a890 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
1a8a0 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
1a8b0 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
1a8c0 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
1a8d0 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
1a8e0 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
1a8f0 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
1a900 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
1a910 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
1a920 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
1a930 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
1a940 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
1a950 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
1a960 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
1a970 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
1a980 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1a990 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
1a9a0 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
1a9b0 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
1a9c0 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
1a9d0 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
1a9e0 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
1a9f0 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
1aa00 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
1aa10 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
1aa20 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
1aa30 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
1aa40 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
1aa50 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
1aa60 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
1aa70 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
1aa80 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
1aa90 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1aaa0 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
1aab0 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
1aac0 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
1aad0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
1aae0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
1aaf0 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
1ab00 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1ab10 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
1ab20 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
1ab30 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
1ab40 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1ab50 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
1ab60 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
1ab70 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
1ab80 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
1ab90 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
1aba0 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
1abb0 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
1abc0 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
1abd0 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
1abe0 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
1abf0 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
1ac00 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
1ac10 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
1ac20 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
1ac30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1ac40 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1ac50 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
1ac60 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
1ac70 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
1ac80 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
1ac90 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
1aca0 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
1acb0 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
1acc0 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
1acd0 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
1ace0 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
1acf0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1ad00 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
1ad10 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
1ad20 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
1ad30 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
1ad40 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
1ad50 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ad60 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
1ad70 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
1ad80 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
1ad90 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1ada0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
1adb0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
1adc0 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e  =sizeof(pMem->u.
1add0 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
1ade0 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e  py(&v, &pMem->u.
1adf0 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
1ae00 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
1ae10 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
1ae20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
1ae30 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
1ae40 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
1ae50 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
1ae60 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
1ae70 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ype];.    assert
1ae80 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b  ( i>0 );.    do{
1ae90 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20  .      buf[--i] 
1aea0 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a  = (u8)(v&0xFF);.
1aeb0 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
1aec0 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a     }while( i );.
1aed0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
1aee0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
1aef0 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
1af00 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1af10 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
1af20 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
1af30 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
1af40 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
1af50 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
1af60 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
1af70 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1af80 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1af90 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
1afa0 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c  em->n;.    if( l
1afb0 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75  en>0 ) memcpy(bu
1afc0 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
1afd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
1afe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
1aff0 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
1b000 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
1b010 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20   0;.}../* Input 
1b020 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63  "x" is a sequenc
1b030 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68  e of unsigned ch
1b040 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65  aracters that re
1b050 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67  present a.** big
1b060 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e  -endian integer.
1b070 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75    Return the equ
1b080 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69  ivalent native i
1b090 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  nteger.*/.#defin
1b0a0 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78  e ONE_BYTE_INT(x
1b0b0 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d  )    ((i8)(x)[0]
1b0c0 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59  ).#define TWO_BY
1b0d0 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35  TE_INT(x)    (25
1b0e0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
1b0f0 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[1]).#define T
1b100 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29  HREE_BYTE_INT(x)
1b110 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78    (65536*(i8)((x
1b120 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38  )[0])|((x)[1]<<8
1b130 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e  )|(x)[2]).#defin
1b140 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  e FOUR_BYTE_UINT
1b150 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b  (x)  (((u32)(x)[
1b160 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c  0]<<24)|((x)[1]<
1b170 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1b180 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65  |(x)[3]).#define
1b190 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78   FOUR_BYTE_INT(x
1b1a0 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29  ) (16777216*(i8)
1b1b0 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
1b1c0 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
1b1d0 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a  )|(x)[3])../*.**
1b1e0 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
1b1f0 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
1b200 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
1b210 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
1b220 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
1b230 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
1b240 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
1b250 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1b260 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ytes read..**.**
1b270 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b280 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1b290 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f   two separate ro
1b2a0 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f  utines for perfo
1b2b0 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66  rmance..** The f
1b2c0 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65  ew cases that re
1b2d0 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69  quire local vari
1b2e0 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e  ables are broken
1b2f0 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61   out into a sepa
1b300 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  rate.** routine 
1b310 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20  so that in most 
1b320 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65  cases the overhe
1b330 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65  ad of moving the
1b340 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a   stack pointer.*
1b350 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f  * is avoided..*/
1b360 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c   .static u32 SQL
1b370 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72  ITE_NOINLINE ser
1b380 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
1b390 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
1b3a0 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
1b3b0 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
1b3c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
1b3d0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
1b3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
1b3f0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
1b400 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
1b410 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
1b420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
1b430 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
1b440 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
1b450 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55  ){.  u64 x = FOU
1b460 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
1b470 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52  ;.  u32 y = FOUR
1b480 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34  _BYTE_UINT(buf+4
1b490 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29  );.  x = (x<<32)
1b4a0 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69   + y;.  if( seri
1b4b0 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
1b4c0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1b4d0 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20  : R-29851-52272 
1b4e0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1b4f0 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20  ndian 64-bit.   
1b500 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1b510 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1b520 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1b530 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70  *(i64*)&x;.    p
1b540 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1b550 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61  _Int;.    testca
1b560 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1b570 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b580 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1b590 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61  R-57343-49114 Va
1b5a0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1b5b0 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30  ian IEEE 754-200
1b5c0 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  8 64-bit.    ** 
1b5d0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e  floating point n
1b5e0 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64  umber. */.#if !d
1b5f0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
1b600 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1b610 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1b620 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65  POINT).    /* Ve
1b630 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
1b640 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
1b650 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
1b660 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a   the same.    **
1b670 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
1b680 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
1b690 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
1b6a0 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
1b6b0 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
1b6c0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1b6d0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
1b6e0 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
1b6f0 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
1b700 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
1b710 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
1b720 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
1b730 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63  <<32;.    static
1b740 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
1b750 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20   = 1.0;.    u64 
1b760 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61  t2 = t1;.    swa
1b770 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1b780 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72  t(t2);.    asser
1b790 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
1b7a0 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
1b7b0 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
1b7c0 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
1b7d0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
1b7e0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
1b7f0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
1b800 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73  u.r)==8 );.    s
1b810 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1b820 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63  oat(x);.    memc
1b830 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26  py(&pMem->u.r, &
1b840 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
1b850 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1b860 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
1b870 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e  em->u.r) ? MEM_N
1b880 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
1b890 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a    }.  return 8;.
1b8a0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  }.u32 sqlite3Vdb
1b8b0 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
1b8c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1b8d0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
1b8e0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
1b8f0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
1b900 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b920 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
1b930 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
1b940 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b960 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
1b970 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
1b980 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
1b990 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1b9a0 20 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f      case 10: { /
1b9b0 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f  * Internal use o
1b9c0 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76  nly: NULL with v
1b9d0 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55              ** U
1b9f0 50 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20  PDATE no-change 
1ba00 66 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20  flag set */.    
1ba10 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1ba20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72  MEM_Null|MEM_Zer
1ba30 6f 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  o;.      pMem->n
1ba40 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d   = 0;.      pMem
1ba50 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  ->u.nZero = 0;. 
1ba60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ba70 7d 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  }.    case 11:  
1ba80 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
1ba90 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
1baa0 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
1bab0 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f   Null */.      /
1bac0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1bad0 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c  -24078-09375 Val
1bae0 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f  ue is a NULL. */
1baf0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1bb00 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
1bb10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bb20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a  }.    case 1: {.
1bb30 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1bb40 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35  E-OF: R-44885-25
1bb50 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20  196 Value is an 
1bb60 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c  8-bit twos-compl
1bb70 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69  ement.      ** i
1bb80 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1bb90 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
1bba0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1bbb0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1bbc0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1bbd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1bbe0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1bbf0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1bc00 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1bc10 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1bc20 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1bc30 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1bc40 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20  : R-49794-35026 
1bc50 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1bc60 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20  ndian 16-bit.   
1bc70 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1bc80 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1bc90 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1bca0 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
1bcb0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1bcc0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1bcd0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1bce0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1bcf0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1bd00 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
1bd10 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
1bd20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1bd30 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1bd40 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39  ENCE-OF: R-37839
1bd50 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20  -54301 Value is 
1bd60 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d  a big-endian 24-
1bd70 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
1bd80 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1bd90 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1bda0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45  Mem->u.i = THREE
1bdb0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1bdc0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1bdd0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1bde0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1bdf0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1be00 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
1be10 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1be20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1be30 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1be40 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1be50 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20  : R-01849-26079 
1be60 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1be70 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20  ndian 32-bit.   
1be80 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1be90 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1bea0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1beb0 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  i = FOUR_BYTE_IN
1bec0 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f  T(buf);.#ifdef _
1bed0 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a  _HP_cc .      /*
1bee0 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73   Work around a s
1bef0 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75  ign-extension bu
1bf00 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70  g in the HP comp
1bf10 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a  iler for HP/UX *
1bf20 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b  /.      if( buf[
1bf30 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e  0]&0x80 ) pMem->
1bf40 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66  u.i |= 0xfffffff
1bf50 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e  f80000000LL;.#en
1bf60 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  dif.      pMem->
1bf70 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1bf80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bf90 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1bfa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
1bfb0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1bfc0 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
1bfd0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1bfe0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1bff0 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39  E-OF: R-50385-09
1c000 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  674 Value is a b
1c010 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74  ig-endian 48-bit
1c020 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1c030 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1c040 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1c050 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1c060 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20  E_UINT(buf+2) + 
1c070 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1c080 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
1c090 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1c0a0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1c0b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c0c0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1c0d0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
1c0e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1c0f0 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
1c100 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1c110 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
1c120 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
1c130 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54  nt */.      /* T
1c140 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76  hese use local v
1c150 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20  ariables, so do 
1c160 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61  them in a separa
1c170 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  te routine.     
1c180 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76   ** to avoid hav
1c190 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ing to move the 
1c1a0 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e  frame pointer in
1c1b0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1c1c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1c1d0 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73   serialGet(buf,s
1c1e0 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29  erial_type,pMem)
1c1f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c200 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
1c210 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
1c220 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
1c230 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45   1 */.      /* E
1c240 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32  VIDENCE-OF: R-12
1c250 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20  976-22893 Value 
1c260 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30  is the integer 0
1c270 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  . */.      /* EV
1c280 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31  IDENCE-OF: R-181
1c290 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69  43-12121 Value i
1c2a0 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e  s the integer 1.
1c2b0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1c2c0 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
1c2d0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
1c2e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1c2f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1c300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
1c310 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
1c320 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1c330 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65  4606-31564 Value
1c340 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20   is a BLOB that 
1c350 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65  is (N-12)/2 byte
1c360 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  s in.      ** le
1c370 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45  ngth..      ** E
1c380 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
1c390 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20  401-00140 Value 
1c3a0 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74  is a string in t
1c3b0 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
1c3c0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e   and.      ** (N
1c3d0 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20  -13)/2 bytes in 
1c3e0 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20  length. */.     
1c3f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
1c400 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
1c410 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d  M_Blob|MEM_Ephem
1c420 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70  , MEM_Str|MEM_Ep
1c430 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65  hem };.      pMe
1c440 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
1c450 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
1c460 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1c470 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
1c480 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
1c490 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
1c4a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1c4b0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20  Mem->n;.    }.  
1c4c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1c4d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1c4e0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
1c4f0 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
1c500 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
1c510 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
1c520 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
1c530 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
1c540 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
1c550 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1c560 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
1c570 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1c580 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
1c590 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
1c5a0 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
1c5b0 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
1c5c0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
1c5d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1c5e0 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
1c5f0 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
1c600 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
1c610 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
1c620 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
1c630 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
1c640 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
1c650 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
1c660 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
1c670 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
1c680 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
1c690 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
1c6a0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
1c6b0 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
1c6c0 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
1c6d0 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
1c6e0 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
1c6f0 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
1c700 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
1c710 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
1c720 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
1c730 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
1c740 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
1c750 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
1c760 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
1c770 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
1c780 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
1c790 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
1c7a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20  Info *pKeyInfo  
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c7c0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1c7d0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  he record */.){.
1c7e0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1c7f0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1c800 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65    /* Unpacked re
1c810 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a  cord to return *
1c820 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c850 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
1c860 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74  for *p */.  nByt
1c870 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
1c880 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1c890 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
1c8a0 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  *(pKeyInfo->nKey
1c8b0 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20  Field+1);.  p = 
1c8c0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1c8d0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1c8e0 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
1c8f0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
1c900 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
1c910 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d    p->aMem = (Mem
1c920 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
1c930 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1c940 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
1c950 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1c960 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1c970 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66   );.  p->pKeyInf
1c980 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1c990 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
1c9a0 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20  Info->nKeyField 
1c9b0 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
1c9c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1c9d0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
1c9e0 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
1c9f0 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
1ca00 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
1ca10 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
1ca20 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
1ca30 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
1ca40 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
1ca50 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
1ca60 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
1ca70 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
1ca80 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1ca90 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
1caa0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1cab0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
1cac0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
1cad0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
1cae0 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1caf0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1cb00 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1cb10 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1cb20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1cb30 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1cb40 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1cb50 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
1cb60 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
1cb70 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
1cb80 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
1cb90 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1cba0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1cbb0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1cbc0 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
1cbd0 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1cc00 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
1cc10 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
1cc20 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc40 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1cc50 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
1cc60 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
1cc70 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
1cc80 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
1cc90 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
1cca0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1ccb0 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
1ccc0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1ccd0 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
1cce0 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
1ccf0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
1cd00 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79  szHdr && d<=nKey
1cd10 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
1cd20 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
1cd30 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
1cd40 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
1cd50 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
1cd60 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
1cd70 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
1cd80 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
1cd90 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
1cda0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
1cdb0 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
1cdc0 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
1cdd0 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
1cde0 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
1cdf0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  loc = 0;.    pMe
1ce00 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20  m->z = 0;.    d 
1ce10 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1ce20 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
1ce30 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
1ce40 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
1ce50 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e  ;.    if( (++u)>
1ce60 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  =p->nField ) bre
1ce70 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ak;.  }.  assert
1ce80 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
1ce90 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  KeyField + 1 );.
1cea0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
1ceb0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1cec0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
1ced0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1cee0 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f  ares two index o
1cef0 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b  r table record k
1cf00 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  eys in the same 
1cf10 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71  way.** as the sq
1cf20 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1cf30 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65  ompare() routine
1cf40 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63  . Unlike VdbeRec
1cf50 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a  ordCompare(),.**
1cf60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1cf70 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20  eserializes and 
1cf80 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20  compares values 
1cf90 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
1cfa0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1cfb0 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d  t() and sqlite3M
1cfc0 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  emCompare() func
1cfd0 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65  tions. It is use
1cfe0 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  d.** in assert()
1cff0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
1d000 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f  nsure that the o
1d010 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e  ptimized code in
1d020 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52  .** sqlite3VdbeR
1d030 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
1d040 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77  eturns results w
1d050 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72  ith these two pr
1d060 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20  imitives..**.** 
1d070 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1d080 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
1d090 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76  parison is equiv
1d0a0 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64  alent to desired
1d0b0 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72  Result..** Retur
1d0c0 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65  n false if there
1d0d0 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65   is a disagreeme
1d0e0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1d0f0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1d100 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
1d110 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1d120 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1d130 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
1d140 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1d150 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68  *pPKey2, /* Righ
1d160 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  t key */.  int d
1d170 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20  esiredResult    
1d180 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1d190 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b  ect answer */.){
1d1a0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1d1b0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1d1c0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1d1d0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1d1e0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1d1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1d200 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1d210 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
1d220 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
1d230 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
1d240 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1d250 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1d260 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
1d270 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
1d280 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d290 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1d2a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1d2b0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
1d2c0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
1d2d0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
1d2e0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
1d2f0 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65  yInfo;.  if( pKe
1d300 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72  yInfo->db==0 ) r
1d310 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e  eturn 1;.  mem1.
1d320 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1d330 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
1d340 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1d350 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
1d360 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
1d370 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
1d380 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1d390 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
1d3a0 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
1d3b0 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1d3c0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1d3d0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1d3e0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
1d3f0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
1d400 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
1d410 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
1d420 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
1d430 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
1d440 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
1d450 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
1d460 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
1d470 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
1d480 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
1d490 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
1d4a0 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
1d4b0 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
1d4c0 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
1d4d0 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
1d4e0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
1d4f0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
1d500 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
1d510 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
1d520 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1d530 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
1d540 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
1d550 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
1d560 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
1d570 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
1d580 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
1d590 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
1d5a0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
1d5b0 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
1d5c0 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
1d5d0 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
1d5e0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
1d5f0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
1d600 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1d610 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28  , szHdr1);.  if(
1d620 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20   szHdr1>98307 ) 
1d630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d640 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a  RRUPT;.  d1 = sz
1d650 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
1d660 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1d670 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1d680 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
1d690 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1d6a0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1d6b0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1d6c0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  rt( pKeyInfo->nK
1d6d0 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  eyField>0 );.  a
1d6e0 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1d6f0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1d700 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1d710 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
1d720 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
1d730 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
1d740 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
1d750 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
1d760 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
1d770 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
1d780 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
1d790 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
1d7a0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1d7b0 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
1d7c0 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
1d7d0 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
1d7e0 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
1d7f0 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
1d800 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
1d810 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
1d820 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
1d830 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1d840 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
1d850 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
1d860 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
1d870 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
1d880 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
1d890 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
1d8a0 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
1d8b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
1d8c0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
1d8d0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1d8e0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
1d8f0 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
1d900 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
1d910 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
1d920 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1d930 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
1d940 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
1d950 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
1d960 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d970 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
1d980 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
1d990 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
1d9a0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1d9b0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1d9c0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1d9d0 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
1d9e0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
1d9f0 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
1da00 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
1da10 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
1da20 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
1da30 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1da40 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
1da50 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1da60 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1da70 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1da80 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1da90 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1daa0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1dab0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1dac0 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
1dad0 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
1dae0 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
1daf0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
1db00 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
1db10 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
1db20 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
1db30 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
1db40 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1db50 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
1db60 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1db70 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1db80 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1db90 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1dba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1dbb0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1dbc0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1dbd0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1dbe0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1dbf0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1dc00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1dc10 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
1dc20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1dc30 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1dc40 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1dc50 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1dc60 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
1dc70 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1dc80 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1dc90 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1dca0 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1dcb0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1dcc0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1dcd0 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
1dce0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1dcf0 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
1dd00 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
1dd10 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
1dd20 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
1dd30 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1dd40 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
1dd50 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1dd60 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1dd70 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
1dd80 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
1dd90 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1dda0 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
1ddb0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1ddc0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1ddd0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1dde0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1ddf0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1de00 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1de10 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1de20 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1de30 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1de40 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1de50 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1de60 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1de70 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1de80 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1de90 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1dea0 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1deb0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
1dec0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e   constraint is n
1ded0 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74  ot satisfied, it
1dee0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1def0 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64  high-speed.** vd
1df00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1df10 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63  nt() and vdbeRec
1df20 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1df30 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  () routines will
1df40 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  .** not work cor
1df50 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73  rectly.  If this
1df60 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66   assert() ever f
1df70 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c  ires, it probabl
1df80 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  y means.** that 
1df90 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79  the KeyInfo.nKey
1dfa0 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f  Field or KeyInfo
1dfb0 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65  .nAllField value
1dfc0 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a  s were computed.
1dfd0 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a  ** incorrectly..
1dfe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
1dff0 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
1e000 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
1e010 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
1e020 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
1e030 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74   /* The record t
1e040 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63  o verify */ .  c
1e050 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
1e060 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20  eyInfo       /* 
1e070 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74  Compare size wit
1e080 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a  h this KeyInfo *
1e090 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  /.){.  int nFiel
1e0a0 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48  d = 0;.  u32 szH
1e0b0 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20  dr;.  u32 idx;. 
1e0c0 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20   u32 notUsed;.  
1e0d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1e0e0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1e0f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1e100 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43  *)pKey;..  if( C
1e110 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1e120 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56  rn;.  idx = getV
1e130 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1e140 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr);.  assert( 
1e150 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
1e160 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32  ert( szHdr<=(u32
1e170 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65  )nKey );.  while
1e180 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20  ( idx<szHdr ){. 
1e190 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1e1a0 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20  int32(aKey+idx, 
1e1b0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46  notUsed);.    nF
1e1c0 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73  ield++;.  }.  as
1e1d0 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20  sert( nField <= 
1e1e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1e1f0 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1e200 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1e210 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1e220 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1e230 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1e240 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1e250 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1e260 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1e270 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1e280 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1e290 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e2a0 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1e2b0 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1e2c0 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1e2d0 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1e2e0 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1e2f0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1e300 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1e310 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1e320 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1e330 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1e340 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1e350 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1e360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1e370 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1e380 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1e390 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1e3a0 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1e3b0 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1e3c0 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1e3f0 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1e400 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1e410 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1e420 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1e430 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1e440 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1e450 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1e460 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1e470 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1e480 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1e490 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1e4a0 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1e4b0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1e4c0 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1e4d0 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1e4e0 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1e4f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1e500 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1e510 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31   *v2;.    Mem c1
1e520 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1e530 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1e540 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1e550 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1e560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1e570 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1e580 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1e590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e5a0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1e5b0 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1e5c0 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1e5d0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1e5e0 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1e5f0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1e600 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1e610 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1e620 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1e630 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32  ll->enc);.    v2
1e640 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1e650 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1e660 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
1e670 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76  enc);.    if( (v
1e680 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29  1==0 || v2==0) )
1e690 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 63 45  {.      if( prcE
1e6a0 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1e6b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1e6c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  ;.      rc = 0;.
1e6d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e6e0 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d   rc = pColl->xCm
1e6f0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
1e700 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20  c1.n, v1, c2.n, 
1e710 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  v2);.    }.    s
1e720 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1e730 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1e740 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1e750 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
1e760 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
1e770 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
1e780 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e   pBlob is guaran
1e790 74 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f  teed to be a Blo
1e7a0 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61  b that is not ma
1e7b0 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d  rked.** with MEM
1e7c0 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74  _Zero.  Return t
1e7d0 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20  rue if it could 
1e7e0 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a  be a zero-blob..
1e7f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
1e800 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68  AllZero(const ch
1e810 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
1e820 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1e830 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1e840 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74    if( z[i] ) ret
1e850 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1e860 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1e870 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62  Compare two blob
1e880 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
1e890 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1e8a0 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1e8b0 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74  rst.** is less t
1e8c0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1e8d0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1e8e0 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65  he second, respe
1e8f0 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f  ctively..** If o
1e900 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65  ne blob is a pre
1e910 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72  fix of the other
1e920 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74  , then the short
1e930 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72  er is the lessor
1e940 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e  ..*/.SQLITE_NOIN
1e950 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1e960 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1e970 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1e980 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1e990 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d  nt c;.  int n1 =
1e9a0 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e   pB1->n;.  int n
1e9b0 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f  2 = pB2->n;..  /
1e9c0 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
1e9d0 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20   to have a Blob 
1e9e0 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73  value that has s
1e9f0 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e  ome non-zero con
1ea00 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  tent.  ** follow
1ea10 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65  ed by zero conte
1ea20 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e  nt.  But that on
1ea30 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20  ly comes up for 
1ea40 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a  Blobs formed.  *
1ea50 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  * by the OP_Make
1ea60 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61  Record opcode, a
1ea70 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65  nd such Blobs ne
1ea80 76 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69  ver get passed i
1ea90 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1eaa0 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f  MemCompare(). */
1eab0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d  .  assert( (pB1-
1eac0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1ead0 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29  o)==0 || n1==0 )
1eae0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32  ;.  assert( (pB2
1eaf0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1eb00 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20  ro)==0 || n2==0 
1eb10 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e  );..  if( (pB1->
1eb20 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73  flags|pB2->flags
1eb30 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  ) & MEM_Zero ){.
1eb40 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61      if( pB1->fla
1eb50 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20  gs & pB2->flags 
1eb60 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1eb70 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e      return pB1->
1eb80 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75  u.nZero - pB2->u
1eb90 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73  .nZero;.    }els
1eba0 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73  e if( pB1->flags
1ebb0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1ebc0 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1ebd0 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d  ero(pB2->z, pB2-
1ebe0 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  >n) ) return -1;
1ebf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1ec00 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b  1->u.nZero - n2;
1ec10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ec20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
1ec30 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29  (pB1->z, pB1->n)
1ec40 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ec50 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20      return n1 - 
1ec60 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1ec70 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65    }.  }.  c = me
1ec80 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32  mcmp(pB1->z, pB2
1ec90 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20  ->z, n1>n2 ? n2 
1eca0 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29  : n1);.  if( c )
1ecb0 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74   return c;.  ret
1ecc0 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a  urn n1 - n2;.}..
1ecd0 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61  /*.** Do a compa
1ece0 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20  rison between a 
1ecf0 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
1ed00 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62  teger and a 64-b
1ed10 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  it floating-poin
1ed20 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65  t.** number.  Re
1ed30 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1ed40 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1ed50 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69   if the first (i
1ed60 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  64) is less than
1ed70 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  ,.** equal to, o
1ed80 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1ed90 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c  he second (doubl
1eda0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1edb0 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  t sqlite3IntFloa
1edc0 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20  tCompare(i64 i, 
1edd0 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28  double r){.  if(
1ede0 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
1edf0 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20  LE_TYPE)>8 ){.  
1ee00 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
1ee10 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c  E x = (LONGDOUBL
1ee20 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66  E_TYPE)i;.    if
1ee30 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( x<r ) return -
1ee40 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29  1;.    if( x>r )
1ee50 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1ee60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1ee70 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20  e{.    i64 y;.  
1ee80 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20    double s;.    
1ee90 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33  if( r<-922337203
1eea0 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1eeb0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66  eturn +1;.    if
1eec0 28 20 72 3e 3d 39 32 32 33 33 37 32 30 33 36 38  ( r>=92233720368
1eed0 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74  54775808.0 ) ret
1eee0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20  urn -1;.    y = 
1eef0 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20  (i64)r;.    if( 
1ef00 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  i<y ) return -1;
1ef10 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 20 72  .    if( i>y ) r
1ef20 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 73 20  eturn +1;.    s 
1ef30 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20  = (double)i;.   
1ef40 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72   if( s<r ) retur
1ef50 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e  n -1;.    if( s>
1ef60 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1ef70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ef80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1ef90 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e  e the values con
1efa0 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77  tained by the tw
1efb0 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20  o memory cells, 
1efc0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67  returning.** neg
1efd0 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70  ative, zero or p
1efe0 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31  ositive if pMem1
1eff0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1f000 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1f010 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d  ter.** than pMem
1f020 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72  2. Sorting order
1f030 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74   is NULL's first
1f040 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75  , followed by nu
1f050 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a  mbers (integers.
1f060 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f  ** and reals) so
1f070 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79  rted numerically
1f080 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65  , followed by te
1f090 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68  xt ordered by th
1f0a0 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
1f0b0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e  equence pColl an
1f0c0 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73  d finally blob's
1f0d0 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63   ordered by memc
1f0e0 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  mp()..**.** Two 
1f0f0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1f100 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c  considered equal
1f110 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1f120 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1f130 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73  3MemCompare(cons
1f140 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f  t Mem *pMem1, co
1f150 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20  nst Mem *pMem2, 
1f160 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
1f170 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c  Coll){.  int f1,
1f180 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
1f190 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31  ned_flags;..  f1
1f1a0 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b   = pMem1->flags;
1f1b0 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66  .  f2 = pMem2->f
1f1c0 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64  lags;.  combined
1f1d0 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a  _flags = f1|f2;.
1f1e0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
1f1f0 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65  e3VdbeMemIsRowSe
1f200 74 28 70 4d 65 6d 31 29 20 26 26 20 21 73 71 6c  t(pMem1) && !sql
1f210 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77  ite3VdbeMemIsRow
1f220 53 65 74 28 70 4d 65 6d 32 29 20 29 3b 0a 20 0a  Set(pMem2) );. .
1f230 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1f240 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  e is NULL, it is
1f250 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f   less than the o
1f260 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61  ther. If both va
1f270 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55  lues.  ** are NU
1f280 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  LL, return 0..  
1f290 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1f2a0 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  d_flags&MEM_Null
1f2b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1f2c0 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28  f2&MEM_Null) - (
1f2d0 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  f1&MEM_Null);.  
1f2e0 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74  }..  /* At least
1f2f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
1f300 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62  values is a numb
1f310 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  er.  */.  if( co
1f320 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45  mbined_flags&(ME
1f330 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20  M_Int|MEM_Real) 
1f340 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1f350 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d   f2 & MEM_Int)!=
1f360 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1f370 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d  Mem1->u.i < pMem
1f380 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1f390 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1f3a0 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32  em1->u.i > pMem2
1f3b0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b  ->u.i ) return +
1f3c0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1f3d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1f3e0 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
1f3f0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1f400 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
1f410 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   < pMem2->u.r ) 
1f420 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1f430 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1f440 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  > pMem2->u.r ) r
1f450 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1f460 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1f470 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
1f480 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1f490 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61   if( (f2&MEM_Rea
1f4a0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
1f4b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1f4c0 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1f4d0 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32  Mem1->u.i, pMem2
1f4e0 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
1f4f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1f500 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
1f510 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1f520 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  1&MEM_Real)!=0 )
1f530 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1f540 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1f550 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73         return -s
1f560 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1f570 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69  mpare(pMem2->u.i
1f580 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20  , pMem1->u.r);. 
1f590 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f5a0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1f5b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1f5c0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a   return +1;.  }.
1f5d0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1f5e0 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61  ue is a string a
1f5f0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
1f600 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69  a blob, the stri
1f610 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a  ng is less..  **
1f620 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72   If both are str
1f630 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73  ings, compare us
1f640 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ing the collatin
1f650 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  g functions..  *
1f660 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1f670 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  _flags&MEM_Str )
1f680 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1f690 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1f6a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1f6b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
1f6c0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1f6d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
1f6e0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  1;.    }..    as
1f6f0 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1f700 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20  ==pMem2->enc || 
1f710 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  pMem1->db->mallo
1f720 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
1f730 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1f740 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
1f750 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  | .            p
1f760 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1f770 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65  E_UTF16LE || pMe
1f780 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1f790 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20  UTF16BE );..    
1f7a0 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  /* The collation
1f7b0 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62   sequence must b
1f7c0 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69  e defined at thi
1f7d0 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66  s point, even if
1f7e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72  .    ** the user
1f7f0 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c   deletes the col
1f800 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1f810 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70  after the vdbe p
1f820 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a  rogram is.    **
1f830 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20   compiled (this 
1f840 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74  was not always t
1f850 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f  he case)..    */
1f860 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43  .    assert( !pC
1f870 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43  oll || pColl->xC
1f880 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  mp );..    if( p
1f890 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1f8a0 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65  turn vdbeCompare
1f8b0 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c  MemString(pMem1,
1f8c0 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30   pMem2, pColl, 0
1f8d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
1f8e0 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  If a NULL pointe
1f8f0 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20  r was passed as 
1f900 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63  the collate func
1f910 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75  tion, fall throu
1f920 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  gh.    ** to the
1f930 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75   blob case and u
1f940 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  se memcmp().  */
1f950 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68  .  }. .  /* Both
1f960 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1f970 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20  blobs.  Compare 
1f980 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
1f990 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
1f9a0 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1f9b0 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d  pMem1, pMem2);.}
1f9c0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  .../*.** The fir
1f9d0 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
1f9e0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1f9f0 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d  ion is a serial-
1fa00 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72  type that.** cor
1fa10 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69  responds to an i
1fa20 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c  nteger - all val
1fa30 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ues between 1 an
1fa40 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a  d 9 inclusive .*
1fa50 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20  * except 7. The 
1fa60 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f  second points to
1fa70 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1fa80 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20  ning an integer 
1fa90 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69  value.** seriali
1faa0 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  zed according to
1fab0 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68   serial_type. Th
1fac0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
1fad0 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20  rializes.** and 
1fae0 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75  returns the valu
1faf0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  e..*/.static i64
1fb00 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1fb10 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f  eInt(u32 serial_
1fb20 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a  type, const u8 *
1fb30 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a  aKey){.  u32 y;.
1fb40 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1fb50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f  T_DB || (serial_
1fb60 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61  type>=1 && seria
1fb70 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72  l_type<=9 && ser
1fb80 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a  ial_type!=7) );.
1fb90 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1fba0 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1fbb0 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a  e 0:.    case 1:
1fbc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fbd0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1fbe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e  .      return ON
1fbf0 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1fc00 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20  ;.    case 2:.  
1fc10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1fc20 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1fc30 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42      return TWO_B
1fc40 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1fc50 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20     case 3:.     
1fc60 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1fc70 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1fc80 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59   return THREE_BY
1fc90 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1fca0 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20    case 4: {.    
1fcb0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1fcc0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1fcd0 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1fce0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1fcf0 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1fd00 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20  int*)&y;.    }. 
1fd10 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20     case 5: {.   
1fd20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1fd30 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1fd40 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42     return FOUR_B
1fd50 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1fd60 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1fd70 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1fd80 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Key);.    }.    
1fd90 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20  case 6: {.      
1fda0 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
1fdb0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1fdc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1fdd0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1fde0 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1fdf0 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1fe00 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1fe10 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36  return (i64)*(i6
1fe20 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  4*)&x;.    }.  }
1fe30 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69  ..  return (seri
1fe40 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a  al_type - 8);.}.
1fe50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1fe60 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
1fe70 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
1fe80 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
1fe90 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  s.** specified b
1fea0 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  y {nKey1, pKey1}
1feb0 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74   and pPKey2.  It
1fec0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74   returns a negat
1fed0 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
1fee0 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
1fef0 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73   if key1 is less
1ff00 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1ff10 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
1ff20 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b  han key2.  The {
1ff30 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65  nKey1, pKey1} ke
1ff40 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  y must be a blob
1ff50 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
1ff60 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1ff70 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
1ff80 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
1ff90 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
1ffa0 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
1ffb0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
1ffc0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1ffd0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
1ffe0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1fff0 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  bSkip is non-zer
20000 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
20010 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
20020 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
20030 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
20040 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  the first fields
20050 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65   of the keys are
20060 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65   equal..**.** Ke
20070 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
20080 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
20090 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
200a0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66  er of fields. If
200b0 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20   all .** fields 
200c0 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62  that appear in b
200d0 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75  oth keys are equ
200e0 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d  al, then pPKey2-
200f0 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a  >default_rc is .
20100 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
20110 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63  ** If database c
20120 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73  orruption is dis
20130 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b  covered, set pPK
20140 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20  ey2->errCode to 
20150 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
20160 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e  PT and return 0.
20170 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
20180 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
20190 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72   .** pPKey2->err
201a0 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53  Code is set to S
201b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c  QLITE_NOMEM and,
201c0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
201d0 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f  LL, the.** mallo
201e0 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65  c-failed flag se
201f0 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  t on database ha
20200 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b  ndle (pPKey2->pK
20210 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a  eyInfo->db)..*/.
20220 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
20230 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
20240 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79  Skip(.  int nKey
20250 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
20260 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
20270 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
20280 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
20290 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
202a0 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  t key */.  int b
202b0 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20  Skip            
202c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
202d0 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20   true, skip the 
202e0 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29  first field */.)
202f0 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
20320 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
20330 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
20340 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20360 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
20370 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f  next field to co
20380 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73  mpare */.  u32 s
20390 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  zHdr1;          
203a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
203b0 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61  ze of record hea
203c0 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  der in bytes */.
203d0 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203f0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
20400 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61  irst type in hea
20410 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  der */.  int rc 
20420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20430 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
20440 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65  rn value */.  Me
20450 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32  m *pRhs = pPKey2
20460 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a  ->aMem;       /*
20470 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70   Next field of p
20480 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65  PKey2 to compare
20490 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
204a0 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74  KeyInfo;.  const
204b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
204c0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
204d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
204e0 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Key1;.  Mem mem1
204f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70  ;..  /* If bSkip
20500 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
20510 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
20520 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64  ready determined
20530 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a   that the first.
20540 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
20550 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72  s in the keys ar
20560 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65  e equal. Fix the
20570 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76   various stack v
20580 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a  ariables so.  **
20590 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
205a0 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72  ne begins compar
205b0 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e  ing at the secon
205c0 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66  d field. */.  if
205d0 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75  ( bSkip ){.    u
205e0 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20  32 s1;.    idx1 
205f0 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33  = 1 + getVarint3
20600 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29  2(&aKey1[1], s1)
20610 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61  ;.    szHdr1 = a
20620 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20  Key1[0];.    d1 
20630 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74  = szHdr1 + sqlit
20640 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
20650 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d  Len(s1);.    i =
20660 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a   1;.    pRhs++;.
20670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
20680 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
20690 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
206a0 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b      d1 = szHdr1;
206b0 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73  .    if( d1>(uns
206c0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a  igned)nKey1 ){ .
206d0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
206e0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
206f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20700 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20710 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
20720 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  */.    }.    i =
20730 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f   0;.  }..  VVA_O
20740 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
20750 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
20760 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
20770 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
20780 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
20790 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
207a0 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  AllField>=pPKey2
207b0 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20  ->nField .      
207c0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
207d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
207e0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
207f0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
20800 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
20810 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  >pKeyInfo->nKeyF
20820 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
20830 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
20840 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
20850 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
20860 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
20870 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
20880 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
20890 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
208a0 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
208b0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
208c0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
208d0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
208e0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
208f0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
20900 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
20910 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
20920 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
20930 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
20940 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
20950 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20960 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
20970 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20980 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
20990 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
209a0 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
209b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71          rc = -sq
209c0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
209d0 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20  pare(pRhs->u.i, 
209e0 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20  mem1.u.r);.     
209f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20a00 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
20a10 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
20a20 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
20a30 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
20a40 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
20a50 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
20a60 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
20a70 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
20a80 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
20a90 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
20aa0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
20ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20ac0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
20ad0 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
20ae0 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
20af0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
20b00 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
20b10 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
20b20 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
20b30 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
20b40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
20b50 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72  rial types 12 or
20b60 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72   greater are str
20b70 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28  ings and blobs (
20b80 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20  greater than.   
20b90 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29       ** numbers)
20ba0 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31  . Types 10 and 1
20bb0 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  1 are currently 
20bc0 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75  "reserved for fu
20bd0 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ture .        **
20be0 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65   use", so it doe
20bf0 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74  sn't really matt
20c00 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75  er what the resu
20c10 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
20c20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d  .        ** them
20c30 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c   to numberic val
20c40 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20  ues are.  */.   
20c50 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
20c60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
20c70 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
20c80 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
20c90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20cb0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
20cc0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
20cd0 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
20ce0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
20cf0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
20d00 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72      if( mem1.u.r
20d10 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20  <pRhs->u.r ){.  
20d20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
20d30 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
20d40 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e  se if( mem1.u.r>
20d50 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
20d60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
20d70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20d90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20da0 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
20db0 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68  re(mem1.u.i, pRh
20dc0 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20  s->u.r);.       
20dd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20de0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
20df0 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
20e00 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
20e10 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
20e20 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
20e30 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
20e40 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
20e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20e60 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
20e70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
20e80 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
20e90 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
20ea0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20eb0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
20ec0 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
20ed0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
20ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
20ef0 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em1.n = (serial_
20f00 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
20f10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20f20 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28  ( (d1+mem1.n)==(
20f30 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
20f40 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20f50 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31  se( (d1+mem1.n+1
20f60 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
20f70 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
20f80 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20  ( (d1+mem1.n) > 
20f90 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
20fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
20fb0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
20fc0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
20fd0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
20fe0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
20ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
21000 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
21010 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
21020 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
21030 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e 61 43 6f  ->pKeyInfo)->aCo
21040 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
21050 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b     mem1.enc = pK
21060 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
21070 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d         mem1.db =
21080 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
21090 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c           mem1.fl
210a0 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ags = MEM_Str;. 
210b0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20           mem1.z 
210c0 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  = (char*)&aKey1[
210d0 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d1];.          r
210e0 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  c = vdbeCompareM
210f0 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  emString(.      
21100 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70          &mem1, p
21110 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  Rhs, pKeyInfo->a
21120 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32  Coll[i], &pPKey2
21130 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
21140 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
21150 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21160 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d  int nCmp = MIN(m
21170 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b  em1.n, pRhs->n);
21180 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21190 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
211a0 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
211b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
211c0 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65   rc==0 ) rc = me
211d0 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20  m1.n - pRhs->n; 
211e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
211f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21200 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a   RHS is a blob *
21210 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
21220 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
21230 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61  _Blob ){.      a
21240 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c  ssert( (pRhs->fl
21250 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
21260 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30  =0 || pRhs->n==0
21270 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72   );.      getVar
21280 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
21290 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
212a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
212b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
212c0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
212d0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
212e0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
212f0 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
21300 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
21310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
21320 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
21330 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
21340 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21350 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
21360 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
21370 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21380 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
21390 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
213a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
213b0 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
213c0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
213d0 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
213e0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
213f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21400 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
21410 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21420 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
21430 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
21440 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e  }else if( pRhs->
21450 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
21460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
21470 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f  ( !isAllZero((co
21480 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31  nst char*)&aKey1
21490 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20  [d1],nStr) ){.  
214a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
214b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
214c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
214d0 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
214e0 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
214f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
21500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
21510 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
21520 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
21530 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
21540 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
21550 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
21560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21570 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
21580 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
21590 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
215a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
215b0 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
215c0 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
215d0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
215e0 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
215f0 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
21600 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
21610 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
21620 69 66 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  if( pPKey2->pKey
21630 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
21640 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
21650 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
21660 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
21670 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21680 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
21690 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20  y1, pPKey2, rc) 
216a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
216b0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
216c0 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
216d0 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
216e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
216f0 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20     }..    i++;. 
21700 20 20 20 69 66 28 20 69 3d 3d 70 50 4b 65 79 32     if( i==pPKey2
21710 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
21720 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20  ;.    pRhs++;.  
21730 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
21740 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
21750 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
21760 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74     idx1 += sqlit
21770 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69  e3VarintLen(seri
21780 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  al_type);.  }whi
21790 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e  le( idx1<(unsign
217a0 65 64 29 73 7a 48 64 72 31 20 26 26 20 64 31 3c  ed)szHdr1 && d1<
217b0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
217c0 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
217d0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
217e0 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
217f0 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
21800 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
21810 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
21820 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
21830 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
21840 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
21850 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
21860 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
21870 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
21880 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f  ease(&mem1).  */
21890 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
218a0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
218b0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
218c0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
218d0 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65  r both of the ke
218e0 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
218f0 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
21900 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
21910 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
21920 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
21930 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
21940 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
21950 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
21960 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  T_DB .       || 
21970 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21980 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
21990 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b  ey1, pPKey2, pPK
219a0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29  ey2->default_rc)
219b0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65   .       || pPKe
219c0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
219d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
219e0 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71   );.  pPKey2->eq
219f0 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75  Seen = 1;.  retu
21a00 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
21a10 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  lt_rc;.}.int sql
21a20 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21a30 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
21a40 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
21a50 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
21a60 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
21a70 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
21a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
21a90 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72  ht key */.){.  r
21aa0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
21ab0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
21ac0 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
21ad0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
21ae0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
21af0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
21b00 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
21b10 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
21b20 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
21b30 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
21b40 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
21b50 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
21b60 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
21b70 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
21b80 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
21b90 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
21ba0 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
21bb0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
21bc0 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
21bd0 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a  than 128)..**.**
21be0 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72   To avoid concer
21bf0 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20  ns about buffer 
21c00 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20  overreads, this 
21c10 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
21c20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d  used.** on schem
21c30 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78  as where the max
21c40 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65  imum valid heade
21c50 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74  r size is 63 byt
21c60 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73  es or less..*/.s
21c70 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
21c80 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a  cordCompareInt(.
21c90 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
21ca0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
21cb0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
21cc0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
21cd0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
21ce0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
21cf0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
21d00 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38  ey = &((const u8
21d10 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74  *)pKey1)[*(const
21d20 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33   u8*)pKey1 & 0x3
21d30 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  F];.  int serial
21d40 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20  _type = ((const 
21d50 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20  u8*)pKey1)[1];. 
21d60 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20   int res;.  u32 
21d70 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36  y;.  u64 x;.  i6
21d80 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a  4 v;.  i64 lhs;.
21d90 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
21da0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
21db0 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
21dc0 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
21dd0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
21de0 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78  *(u8*)pKey1)<=0x
21df0 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  3F || CORRUPT_DB
21e00 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
21e10 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
21e20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
21e30 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
21e40 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
21e50 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
21e60 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
21e70 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
21e80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21e90 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
21ea0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
21eb0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
21ec0 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54     lhs = TWO_BYT
21ed0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
21ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
21ef0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
21f00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21f10 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
21f20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
21f30 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
21f40 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
21f50 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
21f60 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
21f70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21f80 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
21f90 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
21fa0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
21fb0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
21fc0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
21fd0 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e   lhs = (i64)*(in
21fe0 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73  t*)&y;.      tes
21ff0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
22000 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22010 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
22020 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
22030 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
22040 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59     lhs = FOUR_BY
22050 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
22060 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
22070 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
22080 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
22090 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
220a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
220b0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f  .    case 6: { /
220c0 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
220d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
220e0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
220f0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
22100 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
22110 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
22120 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73  ey+4);.      lhs
22130 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
22140 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
22150 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
22160 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
22170 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73  se 8: .      lhs
22180 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
22190 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20  k;.    case 9:. 
221a0 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20       lhs = 1;.  
221b0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
221c0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75  /* This case cou
221d0 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69  ld be removed wi
221e0 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74  thout changing t
221f0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75  he results of ru
22200 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69  nning.    ** thi
22210 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e  s code. Includin
22220 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20  g it causes gcc 
22230 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61  to generate a fa
22240 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20  ster switch .   
22250 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73   ** statement (s
22260 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f  ince the range o
22270 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73  f switch targets
22280 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a   now starts at z
22290 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ero and.    ** i
222a0 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75  s contiguous) bu
222b0 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  t does not cause
222c0 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63   any duplicate c
222d0 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61  ode to be genera
222e0 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67  ted.    ** (as g
222f0 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f  cc is clever eno
22300 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  ugh to combine t
22310 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65  he two like case
22320 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a  s). Other .    *
22330 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68  * compilers migh
22340 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a  t be similar.  *
22350 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63  / .    case 0: c
22360 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74  ase 7:.      ret
22370 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
22380 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
22390 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
223a0 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  2);..    default
223b0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
223c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
223d0 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
223e0 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20  Key1, pPKey2);. 
223f0 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32   }..  v = pPKey2
22400 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20  ->aMem[0].u.i;. 
22410 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20   if( v>lhs ){.  
22420 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22430 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r1;.  }else if( 
22440 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v<lhs ){.    res
22450 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
22460 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
22470 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
22480 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
22490 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
224a0 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
224b0 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72  . Compare the tr
224c0 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66  ailing .    ** f
224d0 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72  ields.  */.    r
224e0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
224f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
22500 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
22510 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
22520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
22530 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
22540 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
22550 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
22560 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
22570 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
22580 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
22590 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
225a0 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
225b0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
225c0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
225d0 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
225e0 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  = 1;.  }..  asse
225f0 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
22600 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
22610 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
22620 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72   res) );.  retur
22630 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
22640 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
22650 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
22660 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
22670 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22680 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
22690 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
226a0 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20   of pPKey2 is a 
226b0 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29  string, that (b)
226c0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
226d0 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c  .** uses the col
226e0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
226f0 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74  BINARY and (c) t
22700 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
22710 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a  header varint .*
22720 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
22730 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
22740 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
22750 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
22760 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
22770 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20  ompareString(.  
22780 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
22790 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
227a0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
227b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
227c0 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
227d0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
227e0 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
227f0 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
22800 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69  Key1;.  int seri
22810 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  al_type;.  int r
22820 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
22830 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  PKey2->aMem[0].f
22840 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
22850 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ;.  vdbeAssertFi
22860 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
22870 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
22880 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
22890 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  nfo);.  getVarin
228a0 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
228b0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
228c0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
228d0 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
228e0 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
228f0 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
22900 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
22910 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
22920 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
22930 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
22940 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
22950 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
22960 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
22970 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
22980 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
22990 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
229a0 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
229b0 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
229c0 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
229d0 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
229e0 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
229f0 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
22a00 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
22a10 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
22a20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
22a30 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
22a40 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
22a50 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
22a60 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
22a70 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
22a80 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
22a90 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
22aa0 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
22ab0 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
22ac0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
22ad0 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
22ae0 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
22af0 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
22b00 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
22b10 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
22b20 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
22b30 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
22b40 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22b50 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
22b60 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
22b70 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
22b80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
22b90 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
22ba0 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20  lt_rc;.         
22bb0 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
22bc0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
22bd0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
22be0 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es>0 ){.        
22bf0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
22c00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22c10 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
22c20 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d  ey2->r1;.      }
22c30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
22c40 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65  es>0 ){.      re
22c50 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
22c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22c70 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
22c80 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
22c90 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
22ca0 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
22cb0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22cc0 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20  ey2, res).      
22cd0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
22ce0 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
22cf0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
22d00 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
22d10 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
22d20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
22d30 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
22d40 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22d50 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74  Compare() compat
22d60 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ible function.**
22d70 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f   suitable for co
22d80 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a  mparing serializ
22d90 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ed records to th
22da0 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
22db0 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  d passed.** as t
22dc0 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
22dd0 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61  ..*/.RecordCompa
22de0 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  re sqlite3VdbeFi
22df0 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b  ndCompare(Unpack
22e00 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
22e10 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  /* varintRecordC
22e20 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
22e30 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
22e40 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68  areString() both
22e50 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61   assume.  ** tha
22e60 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
22e70 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74  ader varint that
22e80 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
22e90 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63  tart of each rec
22ea0 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e  ord.  ** fits in
22eb0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28   a single byte (
22ec0 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c  i.e. is 127 or l
22ed0 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f  ess). varintReco
22ee0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20  rdCompareInt(). 
22ef0 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   ** also assumes
22f00 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
22f10 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62   to overread a b
22f20 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73  uffer by at leas
22f30 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69  t the .  ** maxi
22f40 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67  mum possible leg
22f50 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70  al header size p
22f60 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63  lus 8 bytes. Bec
22f70 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20  ause there is.  
22f80 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
22f90 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20   be at least 74 
22fa0 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79  (but not 136) by
22fb0 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66  tes of padding f
22fc0 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20  ollowing each.  
22fd0 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
22fe0 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64   to varintRecord
22ff0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69  CompareInt() thi
23000 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65  s makes it conve
23010 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69  nient to.  ** li
23020 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  mit the size of 
23030 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34  the header to 64
23040 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20   bytes in cases 
23050 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
23060 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e  field.  ** is an
23070 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20   integer..  **. 
23080 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20   ** The easiest 
23090 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  way to enforce t
230a0 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20  his limit is to 
230b0 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65  consider only re
230c0 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20  cords with.  ** 
230d0 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73  13 fields or les
230e0 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
230f0 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65  field is an inte
23100 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ger, the maximum
23110 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64   legal.  ** head
23120 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35  er size is (12*5
23130 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e   + 1 + 1) bytes.
23140 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b    */.  if( p->pK
23150 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
23160 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  d<=13 ){.    int
23170 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
23180 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
23190 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
231a0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
231b0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
231c0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
231d0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
231e0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
231f0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
23200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23210 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
23220 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
23230 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
23240 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
23250 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
23260 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
23270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
23280 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
23290 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
232a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
232b0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
232c0 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
232d0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
232e0 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
232f0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
23300 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
23310 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
23320 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
23330 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
23340 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
23350 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
23360 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
23370 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
23380 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
23390 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
233a0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
233b0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
233c0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
233d0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
233e0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
233f0 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
23400 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
23410 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
23420 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
23430 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
23440 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
23450 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
23460 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
23470 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
23480 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
23490 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
234a0 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
234b0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
234c0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
234d0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
234e0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
234f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
23500 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
23510 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
23520 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
23530 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
23540 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
23550 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
23560 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
23570 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
23580 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
23590 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
235a0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
235b0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
235c0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
235d0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
235e0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
235f0 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
23600 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
23610 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
23620 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
23630 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
23640 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
23650 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
23660 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
23670 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
23680 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
23690 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
236a0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
236b0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
236c0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
236d0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
236e0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
236f0 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
23700 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
23710 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
23720 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
23730 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    nCellKey = sql
23740 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
23750 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73  Size(pCur);.  as
23760 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
23770 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
23780 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
23790 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
237a0 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
237b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
237c0 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  dex entry */.  s
237d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
237e0 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
237f0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
23800 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
23810 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
23820 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  Key, &m);.  if( 
23830 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
23840 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
23850 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
23860 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
23870 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
23880 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
23890 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
238a0 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
238b0 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
238c0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
238d0 3d 6d 2e 6e 20 29 3b 0a 20 20 74 65 73 74 63 61  =m.n );.  testca
238e0 73 65 28 20 73 7a 48 64 72 3e 30 78 37 66 66 66  se( szHdr>0x7fff
238f0 66 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  ffff );.  assert
23900 28 20 6d 2e 6e 3e 3d 30 20 29 3b 0a 20 20 69 66  ( m.n>=0 );.  if
23910 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
23920 3c 33 20 7c 7c 20 73 7a 48 64 72 3e 28 75 6e 73  <3 || szHdr>(uns
23930 69 67 6e 65 64 29 6d 2e 6e 29 20 29 7b 0a 20 20  igned)m.n) ){.  
23940 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
23950 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
23960 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
23970 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
23980 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
23990 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
239a0 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
239b0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
239c0 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
239d0 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
239e0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
239f0 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
23a00 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
23a10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
23a20 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
23a30 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
23a40 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
23a50 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
23a60 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
23a70 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
23a80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
23a90 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
23aa0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
23ab0 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
23ac0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
23ad0 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
23ae0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
23af0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
23b00 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
23b10 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
23b20 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
23b30 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
23b40 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
23b50 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
23b60 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
23b70 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d  Sizes[typeRowid]
23b80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
23b90 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
23ba0 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
23bb0 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
23bc0 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
23bd0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
23be0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
23bf0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
23c00 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
23c10 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
23c20 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
23c30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
23c40 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
23c50 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
23c60 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
23c70 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
23c80 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
23c90 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
23ca0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23cb0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
23cc0 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
23cd0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
23ce0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
23cf0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
23d00 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
23d10 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
23d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23d30 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
23d40 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
23d50 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
23d60 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
23d70 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
23d80 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
23d90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23da0 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
23db0 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
23dc0 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
23dd0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
23de0 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
23df0 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
23e00 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
23e10 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
23e20 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
23e30 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
23e40 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
23e50 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
23e60 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
23e70 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
23e80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
23e90 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
23ea0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
23eb0 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
23ec0 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
23ed0 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
23ee0 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
23ef0 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
23f00 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
23f10 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
23f20 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
23f30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23f40 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
23f50 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
23f60 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
23f70 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
23f80 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
23f90 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
23fa0 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
23fb0 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
23fc0 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
23fd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
23fe0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
23ff0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
24020 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
24030 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
24060 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
24070 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
24080 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
24090 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
240a0 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
240b0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
240c0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
240d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
240e0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
240f0 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
24100 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
24110 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
24120 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
24130 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  ur;.  Mem m;..  
24140 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
24150 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
24160 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20  REE );.  pCur = 
24170 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
24180 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24190 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
241a0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
241b0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
241c0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
241d0 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43  e(pCur);.  /* nC
241e0 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
241f0 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
24200 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
24210 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
24220 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
24230 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
24240 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
24250 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
24260 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
24270 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
24280 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
24290 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
242a0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
242b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
242c0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
242d0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
242e0 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
242f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
24300 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
24310 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
24320 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
24330 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24340 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73  ;.  }.  *res = s
24350 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
24360 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
24370 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
24380 6b 65 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ked, 0);.  sqlit
24390 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
243a0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
243b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
243c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
243d0 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
243e0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
243f0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
24400 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
24410 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
24420 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
24430 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
24440 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
24450 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
24460 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
24470 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24480 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
24490 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
244a0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
244b0 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
244c0 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
244d0 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
244e0 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
244f0 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
24500 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
24510 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
24520 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
24530 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24540 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
24550 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
24560 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
24570 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
24580 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
24590 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
245a0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
245b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
245c0 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
245d0 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
245e0 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
245f0 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
24600 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
24610 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
24620 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
24630 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
24640 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
24650 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
24660 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
24670 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
24680 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
24690 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
246a0 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
246b0 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
246c0 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
246d0 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
246e0 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
246f0 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
24700 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
24710 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  lete..**.** If i
24720 43 6f 64 65 20 69 73 20 31 2c 20 74 68 65 6e 20  Code is 1, then 
24730 65 78 70 69 72 61 74 69 6f 6e 20 69 73 20 61 64  expiration is ad
24740 76 69 73 6f 72 79 2e 20 20 54 68 65 20 73 74 61  visory.  The sta
24750 74 65 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  tement should.**
24760 20 62 65 20 72 65 70 72 65 70 61 72 65 64 20 62   be reprepared b
24770 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 73 74  efore being rest
24780 61 72 74 65 64 2c 20 62 75 74 20 69 66 20 69 74  arted, but if it
24790 20 69 73 20 61 6c 72 65 61 64 79 20 72 75 6e 6e   is already runn
247a0 69 6e 67 0a 2a 2a 20 69 74 20 69 73 20 61 6c 6c  ing.** it is all
247b0 6f 77 65 64 20 74 6f 20 72 75 6e 20 74 6f 20 63  owed to run to c
247c0 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ompletion..**.**
247d0 20 49 6e 74 65 72 6e 61 6c 6c 79 2c 20 74 68 69   Internally, thi
247e0 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
247f0 73 65 74 73 20 74 68 65 20 56 64 62 65 2e 65 78  sets the Vdbe.ex
24800 70 69 72 65 64 20 66 6c 61 67 20 6f 6e 20 61 6c  pired flag on al
24810 6c 0a 2a 2a 20 70 72 65 70 61 72 65 64 20 73 74  l.** prepared st
24820 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 66  atements.  The f
24830 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 20  lag is set to 1 
24840 66 6f 72 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  for an immediate
24850 20 65 78 70 69 72 61 74 69 6f 6e 0a 2a 2a 20 61   expiration.** a
24860 6e 64 20 73 65 74 20 74 6f 20 32 20 66 6f 72 20  nd set to 2 for 
24870 61 6e 20 61 64 76 69 73 6f 72 79 20 65 78 70 69  an advisory expi
24880 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
24890 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
248a0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
248b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
248c0 20 69 43 6f 64 65 29 7b 0a 20 20 56 64 62 65 20   iCode){.  Vdbe 
248d0 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
248e0 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
248f0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
24900 65 78 70 69 72 65 64 20 3d 20 69 43 6f 64 65 2b  expired = iCode+
24910 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
24920 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
24930 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
24940 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
24950 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
24960 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
24970 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
24980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24990 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 50 52 45  n the SQLITE_PRE
249a0 50 41 52 45 20 66 6c 61 67 73 20 66 6f 72 20 61  PARE flags for a
249b0 20 56 64 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c   Vdbe..*/.u8 sql
249c0 69 74 65 33 56 64 62 65 50 72 65 70 61 72 65 46  ite3VdbePrepareF
249d0 6c 61 67 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  lags(Vdbe *v){. 
249e0 20 72 65 74 75 72 6e 20 76 2d 3e 70 72 65 70 46   return v->prepF
249f0 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  lags;.}../*.** R
24a00 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
24a10 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
24a20 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
24a30 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
24a40 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
24a50 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
24a60 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
24a70 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
24a80 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
24a90 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
24aa0 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
24ab0 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
24ac0 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
24ad0 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
24ae0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
24af0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
24b00 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
24b10 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
24b20 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
24b30 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
24b40 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
24b50 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
24b60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
24b70 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
24b80 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
24b90 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
24ba0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
24bb0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
24bc0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
24bd0 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
24be0 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
24bf0 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26   (v->db->flags &
24c00 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
24c10 53 47 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  SG)==0 );.    if
24c20 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67  ( 0==(pMem->flag
24c30 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b  s & MEM_Null) ){
24c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
24c50 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c  alue *pRet = sql
24c60 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e  ite3ValueNew(v->
24c70 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
24c80 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Ret ){.        s
24c90 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
24ca0 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70  y((Mem *)pRet, p
24cb0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
24cc0 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
24cd0 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66  ffinity(pRet, af
24ce0 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  f, SQLITE_UTF8);
24cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
24d00 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
24d10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
24d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
24d30 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
24d40 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
24d50 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
24d60 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
24d70 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
24d80 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
24d90 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
24da0 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
24db0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
24dc0 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
24dd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24de0 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
24df0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
24e00 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
24e10 61 72 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ar>0 );.  assert
24e20 28 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  ( (v->db->flags 
24e30 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51  & SQLITE_EnableQ
24e40 50 53 47 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  PSG)==0 );.  if(
24e50 20 69 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20   iVar>=32 ){.   
24e60 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30   v->expmask |= 0
24e70 78 38 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c  x80000000;.  }el
24e80 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
24e90 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
24ea0 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
24eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61  }../*.** Cause a
24ec0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72   function to thr
24ed0 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
24ee0 74 20 77 61 73 20 63 61 6c 6c 20 66 72 6f 6d 20  t was call from 
24ef0 4f 50 5f 50 75 72 65 46 75 6e 63 0a 2a 2a 20 72  OP_PureFunc.** r
24f00 61 74 68 65 72 20 74 68 61 6e 20 4f 50 5f 46 75  ather than OP_Fu
24f10 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50  nction..**.** OP
24f20 5f 50 75 72 65 46 75 6e 63 20 6d 65 61 6e 73 20  _PureFunc means 
24f30 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
24f40 6e 20 6d 75 73 74 20 62 65 20 64 65 74 65 72 6d  n must be determ
24f50 69 6e 69 73 74 69 63 2c 20 61 6e 64 20 73 68 6f  inistic, and sho
24f60 75 6c 64 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20  uld.** throw an 
24f70 65 72 72 6f 72 20 69 66 20 69 74 20 69 73 20 67  error if it is g
24f80 69 76 65 6e 20 69 6e 70 75 74 73 20 74 68 61 74  iven inputs that
24f90 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 6e   would make it n
24fa0 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
24fb0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
24fc0 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  e is invoked by 
24fd0 64 61 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69  date/time functi
24fe0 6f 6e 73 20 74 68 61 74 20 75 73 65 20 6e 6f 6e  ons that use non
24ff0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0a 2a  -deterministic.*
25000 2a 20 66 65 61 74 75 72 65 73 20 73 75 63 68 20  * features such 
25010 61 73 20 27 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74  as 'now'..*/.int
25020 20 73 71 6c 69 74 65 33 4e 6f 74 50 75 72 65 46   sqlite3NotPureF
25030 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
25040 65 78 74 20 2a 70 43 74 78 29 7b 0a 23 69 66 64  ext *pCtx){.#ifd
25050 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
25060 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
25070 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62    if( pCtx->pVdb
25080 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
25090 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 43  .#endif.  if( pC
250a0 74 78 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70  tx->pVdbe->aOp[p
250b0 43 74 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65  Ctx->iOp].opcode
250c0 3d 3d 4f 50 5f 50 75 72 65 46 75 6e 63 20 29 7b  ==OP_PureFunc ){
250d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
250e0 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
250f0 0a 20 20 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74  .       "non-det
25100 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74  erministic funct
25110 69 6f 6e 20 69 6e 20 69 6e 64 65 78 20 65 78 70  ion in index exp
25120 72 65 73 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b  ression or CHECK
25130 20 63 6f 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20   constraint",.  
25140 20 20 20 20 20 2d 31 29 3b 0a 20 20 20 20 72 65       -1);.    re
25150 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
25160 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 1;.}..#ifnd
25170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
25180 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
25190 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
251a0 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
251b0 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
251c0 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
251d0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
251e0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
251f0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
25200 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
25210 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
25220 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
25230 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
25240 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
25250 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25260 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
25270 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
25280 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
25290 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72    if( pVtab->zEr
252a0 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  rMsg ){.    sqli
252b0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
252c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
252d0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
252e0 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
252f0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
25300 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
25310 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
25320 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
25330 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
25340 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
25350 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
25360 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
25370 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
25380 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25390 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
253a0 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  HOOK../*.** If t
253b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
253c0 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
253d0 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f  release any allo
253e0 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
253f0 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ed .** with the 
25400 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20  memory cells in 
25410 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72  the p->aMem[] ar
25420 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74  ray. Also free t
25430 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  he UnpackedRecor
25440 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  d.** structure i
25450 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c  tself, using sql
25460 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a  ite3DbFree()..**
25470 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25480 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66 72 65  n is used to fre
25490 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e UnpackedRecord
254a0 20 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f   structures allo
254b0 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
254c0 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64  vdbeUnpackRecord
254d0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e  () function foun
254e0 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a  d in vdbeapi.c..
254f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
25500 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
25510 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
25520 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65   nField, Unpacke
25530 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69  dRecord *p){.  i
25540 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
25550 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
25560 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  i<nField; i++){.
25570 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
25580 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20  = &p->aMem[i];. 
25590 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a       if( pMem->z
255a0 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
255b0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
255c0 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
255d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
255e0 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  db, p);.  }.}.#e
255f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
25600 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
25610 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20  HOOK */..#ifdef 
25620 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
25630 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
25640 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  ** Invoke the pr
25650 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49  e-update hook. I
25660 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
25670 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72  ATE or DELETE pr
25680 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a  e-update call,.*
25690 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61  * then cursor pa
256a0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
256b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  nd argument shou
256c0 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ld point to the 
256d0 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20  row about.** to 
256e0 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c  be update or del
256f0 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70  eted. If the app
25700 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
25710 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
25720 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72  _old(),.** the r
25730 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69  equired value wi
25740 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
25750 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
25760 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  or points to..*/
25770 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
25780 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a  ePreUpdateHook(.
25790 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70    /* Vdbe pre-up
257c0 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76  date hook is inv
257d0 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62  oked by */.  Vdb
257e0 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  eCursor *pCsr,  
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25800 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f  Cursor to grab o
25810 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d  ld.* values from
25820 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25840 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
25850 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
25860 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f  r DELETE */.  co
25870 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25890 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a   Database name *
258a0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20      /* Modified 
258d0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69  table */.  i64 i
258e0 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20  Key1,           
258f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25900 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20  itial key value 
25910 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
25940 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72   for new.* recor
25950 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
25960 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20  3 *db = v->db;. 
25970 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72   i64 iKey2;.  Pr
25980 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74  eUpdate preupdat
25990 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
259a0 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e  *zTbl = pTab->zN
259b0 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ame;.  static co
259c0 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f  nst u8 fakeSortO
259d0 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rder = 0;..  ass
259e0 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64  ert( db->pPreUpd
259f0 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ate==0 );.  mems
25a00 65 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30  et(&preupdate, 0
25a10 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61  , sizeof(PreUpda
25a20 74 65 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52  te));.  if( HasR
25a30 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b  owid(pTab)==0 ){
25a40 0a 20 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65  .    iKey1 = iKe
25a50 79 32 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75  y2 = 0;.    preu
25a60 70 64 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69  pdate.pPk = sqli
25a70 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
25a80 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73  ex(pTab);.  }els
25a90 65 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  e{.    if( op==S
25aa0 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
25ab0 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d        iKey2 = v-
25ac0 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b  >aMem[iReg].u.i;
25ad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25ae0 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b    iKey2 = iKey1;
25af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
25b00 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65  sert( pCsr->nFie
25b10 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a  ld==pTab->nCol .
25b20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d         || (pCsr-
25b30 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
25b40 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c  Col+1 && op==SQL
25b50 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52  ITE_DELETE && iR
25b60 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20  eg==-1).  );..  
25b70 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b  preupdate.v = v;
25b80 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43 73  .  preupdate.pCs
25b90 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75  r = pCsr;.  preu
25ba0 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20  pdate.op = op;. 
25bb0 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52   preupdate.iNewR
25bc0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65  eg = iReg;.  pre
25bd0 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64  update.keyinfo.d
25be0 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64  b = db;.  preupd
25bf0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20  ate.keyinfo.enc 
25c00 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65  = ENC(db);.  pre
25c10 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
25c20 4b 65 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d  KeyField = pTab-
25c30 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61  >nCol;.  preupda
25c40 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74  te.keyinfo.aSort
25c50 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61  Order = (u8*)&fa
25c60 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70  keSortOrder;.  p
25c70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d  reupdate.iKey1 =
25c80 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64   iKey1;.  preupd
25c90 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79  ate.iKey2 = iKey
25ca0 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  2;.  preupdate.p
25cb0 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64  Tab = pTab;..  d
25cc0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
25cd0 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62  &preupdate;.  db
25ce0 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
25cf0 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64  back(db->pPreUpd
25d00 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20  ateArg, db, op, 
25d10 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31  zDb, zTbl, iKey1
25d20 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e  , iKey2);.  db->
25d30 70 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a  pPreUpdate = 0;.
25d40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25d50 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52  db, preupdate.aR
25d60 65 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72  ecord);.  vdbeFr
25d70 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
25d80 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
25d90 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72  .nKeyField+1, pr
25da0 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
25db0 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
25dc0 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
25dd0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
25de0 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64  yField+1, preupd
25df0 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64  ate.pNewUnpacked
25e00 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61  );.  if( preupda
25e10 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69  te.aNew ){.    i
25e20 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
25e30 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c  0; i<pCsr->nFiel
25e40 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
25e50 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
25e60 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65 2e  ease(&preupdate.
25e70 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aNew[i]);.    }.
25e80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25e90 65 4e 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74  eNN(db, preupdat
25ea0 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23  e.aNew);.  }.}.#
25eb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
25ec0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
25ed0 5f 48 4f 4f 4b 20 2a 2f 0a                       _HOOK */.