/ Hex Artifact Content
Login

Artifact 54442bffd753cfc400feee9a7e7e689df51016fb:


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 61  se = pParse;.  a
03e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
03f0: 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  Label==0 );.  as
0400: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4c  sert( pParse->nL
0410: 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  abel==0 );.  ass
0420: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4f 70  ert( pParse->nOp
0430: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0440: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0450: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0460: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0470: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 72  ** Change the er
0480: 72 6f 72 20 73 74 72 69 6e 67 20 73 74 6f 72 65  ror string store
0490: 64 20 69 6e 20 56 64 62 65 2e 7a 45 72 72 4d 73  d in Vdbe.zErrMs
04a0: 67 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  g.*/.void sqlite
04b0: 33 56 64 62 65 45 72 72 6f 72 28 56 64 62 65 20  3VdbeError(Vdbe 
04c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
04d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
04e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73   va_list ap;.  s
04f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
0500: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
0510: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
0520: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a  zFormat);.  p->z
0530: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
0540: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
0550: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0560: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
0570: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
0580: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
0590: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
05a0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
05b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
05c0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
05d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
05e0: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
05f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0600: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0610: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0620: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0630: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0640: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0650: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
0660: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
0670: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
0680: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
0690: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
06a0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
06b0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
06c0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
06d0: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
06e0: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
06f0: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61  .}../*.** Swap a
0710: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74 77 65  ll content betwe
0720: 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74 72 75  en two VDBE stru
0730: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 53 77 61 70 28  sqlite3VdbeSwap(
0750: 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65 20 2a  Vdbe *pA, Vdbe *
0760: 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c  pB){.  Vdbe tmp,
0770: 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a   *pTmp;.  char *
0780: 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  zTmp;.  assert( 
0790: 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62 20 29  pA->db==pB->db )
07a0: 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20  ;.  tmp = *pA;. 
07b0: 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70   *pA = *pB;.  *p
07c0: 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20  B = tmp;.  pTmp 
07d0: 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pA->pNext;.  p
07e0: 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70  A->pNext = pB->p
07f0: 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78  Next;.  pB->pNex
0800: 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70  t = pTmp;.  pTmp
0810: 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20   = pA->pPrev;.  
0820: 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e  pA->pPrev = pB->
0830: 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72  pPrev;.  pB->pPr
0840: 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d  ev = pTmp;.  zTm
0850: 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20  p = pA->zSql;.  
0860: 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a  pA->zSql = pB->z
0870: 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20  Sql;.  pB->zSql 
0880: 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73  = zTmp;.  pB->is
0890: 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e  PrepareV2 = pA->
08a0: 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a  isPrepareV2;.}..
08b0: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
08c0: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
08d0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
08e0: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
08f0: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0900: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0910: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0920: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0930: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0940: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0950: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0960: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0970: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0980: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0990: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
09a0: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
09b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
09c0: 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65  be.aOp and Parse
09d0: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
09e0: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28   .** unchanged (
09f0: 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  this is so that 
0a00: 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65  any opcodes alre
0a10: 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  ady allocated ca
0a20: 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74  n be .** correct
0a30: 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61  ly deallocated a
0a40: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65  long with the re
0a50: 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e  st of the Vdbe).
0a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0a70: 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20  rowOpArray(Vdbe 
0a80: 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  *v, int nOp){.  
0a90: 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20  VdbeOp *pNew;.  
0aa0: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
0ab0: 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  arse;..  /* The 
0ac0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0ad0: 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69  LOC_STRESS compi
0ae0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
0af0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f  s designed to fo
0b00: 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72  rce.  ** more fr
0b10: 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20  equent reallocs 
0b20: 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64  and hence provid
0b30: 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  e more opportuni
0b40: 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73  ties for .  ** s
0b50: 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75  imulated OOM fau
0b60: 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53  lts.  SQLITE_TES
0b70: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0b80: 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73   is generally us
0b90: 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  ed.  ** during t
0ba0: 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69  esting only.  Wi
0bb0: 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  th SQLITE_TEST_R
0bc0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72  EALLOC_STRESS gr
0bd0: 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a  ow the op array.
0be0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69    ** by the mini
0bf0: 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75  mum* amount requ
0c00: 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73  ired until the s
0c10: 69 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e  ize reaches 512.
0c20: 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70    Normal.  ** op
0c30: 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74  eration (without
0c40: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0c50: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20  LLOC_STRESS) is 
0c60: 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75  to double the cu
0c70: 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20  rrent.  ** size 
0c80: 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20  of the op array 
0c90: 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70  or add 1KB of sp
0ca0: 61 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69  ace, whichever i
0cb0: 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69  s smaller. */.#i
0cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0cd0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a  _REALLOC_STRESS.
0ce0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0cf0: 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f  >nOpAlloc>=512 ?
0d00: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0d10: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70   p->nOpAlloc+nOp
0d20: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e  );.#else.  int n
0d30: 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c  New = (p->nOpAll
0d40: 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  oc ? p->nOpAlloc
0d50: 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f  *2 : (int)(1024/
0d60: 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20  sizeof(Op)));.  
0d70: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
0d80: 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  (nOp);.#endif.. 
0d90: 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31   assert( nOp<=(1
0da0: 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20  024/sizeof(Op)) 
0db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
0dc0: 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b  w>=(p->nOpAlloc+
0dd0: 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d  nOp) );.  pNew =
0de0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
0df0: 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c  c(p->db, v->aOp,
0e00: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29   nNew*sizeof(Op)
0e10: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
0e20: 0a 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f  .    p->szOpAllo
0e30: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0e40: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0e50: 4e 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70  New);.    p->nOp
0e60: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41  Alloc = p->szOpA
0e70: 6c 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  lloc/sizeof(Op);
0e80: 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e  .    v->aOp = pN
0e90: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0ea0: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0eb0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0ec0: 4d 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69 66 64  M_BKPT);.}..#ifd
0ed0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0ee0: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
0ef0: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
0f00: 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
0f10: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 74  t a breakpoint t
0f20: 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72 65  hat will.** fire
0f30: 20 61 66 74 65 72 20 65 61 63 68 20 6f 70 63 6f   after each opco
0f40: 64 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 61  de is inserted a
0f50: 6e 64 20 64 69 73 70 6c 61 79 65 64 20 75 73 69  nd displayed usi
0f60: 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76 64  ng.** "PRAGMA vd
0f70: 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e  be_addoptrace=on
0f80: 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
0f90: 64 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65  d test_addop_bre
0fa0: 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20  akpoint(void){. 
0fb0: 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20   static int n = 
0fc0: 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64  0;.  n++;.}.#end
0fd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  if../*.** Add a 
0fe0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
0ff0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1000: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
1010: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
1020: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
1030: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1040: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
1050: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
1060: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
1070: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
1080: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
1090: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
10a0: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
10b0: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
10c0: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
10d0: 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20   p1, p2, p3     
10e0: 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20   Operands.**.** 
10f0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
1100: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1110: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69  ) function to fi
1120: 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64  x an address and
1130: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56  .** the sqlite3V
1140: 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75  dbeChangeP4() fu
1150: 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65  nction to change
1160: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1170: 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e  e P4.** operand.
1180: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
1190: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 67  E_NOINLINE int g
11a0: 72 6f 77 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  rowOp3(Vdbe *p, 
11b0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
11c0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
11d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
11e0: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d  arse->nOpAlloc<=
11f0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
1200: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31  growOpArray(p, 1
1210: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
1220: 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73  assert( p->pPars
1230: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e  e->nOpAlloc>p->n
1240: 4f 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  Op );.  return s
1250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1260: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1270: 70 33 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  p3);.}.int sqlit
1280: 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64 62  e3VdbeAddOp3(Vdb
1290: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
12a0: 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e  t p1, int p2, in
12b0: 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t p3){.  int i;.
12c0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a    VdbeOp *pOp;..
12d0: 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20    i = p->nOp;.  
12e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
12f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1300: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
1310: 70 3e 3d 30 20 26 26 20 6f 70 3c 30 78 66 66 20  p>=0 && op<0xff 
1320: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61 72  );.  if( p->pPar
1330: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20  se->nOpAlloc<=i 
1340: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72  ){.    return gr
1350: 6f 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  owOp3(p, op, p1,
1360: 20 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20   p2, p3);.  }.  
1370: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
1380: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
1390: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75  pOp->opcode = (u
13a0: 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20  8)op;.  pOp->p5 
13b0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d  = 0;.  pOp->p1 =
13c0: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
13d0: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
13e0: 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70   p3;.  pOp->p4.p
13f0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74   = 0;.  pOp->p4t
1400: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
1410: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1420: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
1430: 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a  OMMENTS.  pOp->z
1440: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
1450: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1460: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d  E_DEBUG.  if( p-
1470: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1480: 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1490: 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a  ce ){.    int jj
14a0: 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20  , kk;.    Parse 
14b0: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
14c0: 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d  rse;.    for(jj=
14d0: 6b 6b 3d 30 3b 20 6a 6a 3c 70 50 61 72 73 65 2d  kk=0; jj<pParse-
14e0: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 6a 6a 2b 2b  >nColCache; jj++
14f0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1500: 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70  yColCache *x = p
1510: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1520: 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 70 72 69   + jj;.      pri
1530: 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a  ntf(" r[%d]={%d:
1540: 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78  %d}", x->iReg, x
1550: 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f  ->iTable, x->iCo
1560: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b  lumn);.      kk+
1570: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
1580: 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e   kk ) printf("\n
1590: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ");.    sqlite3V
15a0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
15b0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
15c0: 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65    test_addop_bre
15d0: 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23  akpoint();.  }.#
15e0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
15f0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
1600: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
1610: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
1620: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1630: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
1640: 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20    pOp->iSrcLine 
1650: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  = 0;.#endif.  re
1660: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71  turn i;.}.int sq
1670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1680: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29  Vdbe *p, int op)
1690: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
16a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
16b0: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  op, 0, 0, 0);.}.
16c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
16d0: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69  ddOp1(Vdbe *p, i
16e0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a  nt op, int p1){.
16f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1700: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
1710: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  , p1, 0, 0);.}.i
1720: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1730: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp2(Vdbe *p, in
1740: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1750: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p2){.  return 
1760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1770: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1780: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72   0);.}../* Gener
1790: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
17a0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75  unconditional ju
17b0: 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
17c0: 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73  n iDest.*/.int s
17d0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 56  qlite3VdbeGoto(V
17e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
17f0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  t){.  return sql
1800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1810: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 44  , OP_Goto, 0, iD
1820: 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47  est, 0);.}../* G
1830: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1840: 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e 67  cause the string
1850: 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61 64   zStr to be load
1860: 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  ed into.** regis
1870: 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74  ter iDest.*/.int
1880: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1890: 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c 20  String(Vdbe *p, 
18a0: 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74  int iDest, const
18b0: 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20   char *zStr){.  
18c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
18d0: 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 53  beAddOp4(p, OP_S
18e0: 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74  tring8, 0, iDest
18f0: 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 7d  , 0, zStr, 0);.}
1900: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1910: 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69   code that initi
1920: 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65 20  alizes multiple 
1930: 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 72  registers to str
1940: 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a 2a  ing or integer.*
1950: 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
1960: 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  e registers begi
1970: 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e 64  n with iDest and
1980: 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65 63   increase consec
1990: 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20  utively..** One 
19a0: 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
19b0: 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63 68  ialized for each
19c0: 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20 7a   characgter in z
19d0: 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65 61  Types[].  For ea
19e0: 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61 63  ch.** "s" charac
19f0: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c  ter in zTypes[],
1a00: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
1a10: 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68 65   a string if the
1a20: 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
1a30: 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f  not NULL, or OP_
1a40: 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c 75  Null if the valu
1a50: 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  e is a null poin
1a60: 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20 22  ter.  For each "
1a70: 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  i" character.** 
1a80: 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65  in zTypes[], the
1a90: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1aa0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20 69  tialized to an i
1ab0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  nteger..*/.void 
1ac0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
1ad0: 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  Load(Vdbe *p, in
1ae0: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
1af0: 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e  har *zTypes, ...
1b00: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1b10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1b20: 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   c;.  va_start(a
1b30: 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f  p, zTypes);.  fo
1b40: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70  r(i=0; (c = zTyp
1b50: 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  es[i])!=0; i++){
1b60: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20  .    if( c=='s' 
1b70: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1b80: 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28  har *z = va_arg(
1b90: 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
1ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bb0: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d  dbeAddOp4(p, z==
1bc0: 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50  0 ? OP_Null : OP
1bd0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65  _String8, 0, iDe
1be0: 73 74 2b 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a  st++, 0, z, 0);.
1bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c00: 20 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20   assert( c=='i' 
1c10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c20: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
1c30: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
1c40: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
1c50: 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ++);.    }.  }. 
1c60: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
1c70: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1c80: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1c90: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
1ca0: 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  s a pointer..*/.
1cb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1cc0: 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70  ddOp4(.  Vdbe *p
1cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1ce0: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
1cf0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
1d00: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
1d10: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
1d20: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
1d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d40: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
1d50: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d70: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
1d80: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
1d90: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
1da0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
1db0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f   char *zP4,    /
1dc0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
1dd0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
1de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
1df0: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
1e00: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
1e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e20: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1e30: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1e40: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1e50: 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65  ddr, zP4, p4type
1e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1e80: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1e90: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1ea0: 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e  lue with a P4_IN
1eb0: 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41  T64 or.** P4_REA
1ec0: 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  L type..*/.int s
1ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ee0: 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c  Dup8(.  Vdbe *p,
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f00: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1f10: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1f20: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1f30: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1f40: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f60: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1f70: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1f90: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1fa0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1fb0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1fc0: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1fd0: 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a  u8 *zP4,      /*
1fe0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1ff0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
2000: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
2010: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
2020: 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79  {.  char *p4copy
2030: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2040: 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56  ocRawNN(sqlite3V
2050: 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20  dbeDb(p), 8);.  
2060: 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d  if( p4copy ) mem
2070: 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c  cpy(p4copy, zP4,
2080: 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   8);.  return sq
2090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20a0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
20b0: 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70  3, p4copy, p4typ
20c0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  e);.}../*.** Add
20d0: 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65   an OP_ParseSche
20e0: 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  ma opcode.  This
20f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b   routine is brok
2100: 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73  en out from.** s
2110: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2120: 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64  () since it need
2130: 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20  s to also needs 
2140: 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65  to mark all btre
2150: 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20  es.** as having 
2160: 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  been used..**.**
2170: 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69   The zWhere stri
2180: 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ng must have bee
2190: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  n obtained from 
21a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
21b0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
21c0: 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65  e will take owne
21d0: 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c  rship of the all
21e0: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a  ocated memory..*
21f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2200: 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
2210: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
2220: 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72  iDb, char *zWher
2230: 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73  e){.  int j;.  s
2240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2250: 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (p, OP_ParseSche
2260: 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a  ma, iDb, 0, 0, z
2270: 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49  Where, P4_DYNAMI
2280: 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  C);.  for(j=0; j
2290: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  <p->db->nDb; j++
22a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  ) sqlite3VdbeUse
22b0: 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a  sBtree(p, j);.}.
22c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
22d0: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
22e0: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
22f0: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  as an integer..*
2300: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2310: 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64  eAddOp4Int(.  Vd
2320: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
2330: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
2340: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
2350: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
2360: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2370: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
2380: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
2390: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
23a0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
23b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23c0: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
23d0: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
23e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23f0: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
2400: 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20 20  int p4          
2410: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
2420: 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65  erand as an inte
2430: 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ger */.){.  int 
2440: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2450: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
2460: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 69  p1, p2, p3);.  i
2470: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
2480: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
2490: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
24a0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
24b0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
24c0: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f  P4_INT32;.    pO
24d0: 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20  p->p4.i = p4;.  
24e0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
24f0: 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68  .}../* Insert th
2500: 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f  e end of a co-ro
2510: 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71  utine.*/.void sq
2520: 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
2530: 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20 69  utine(Vdbe *v, i
2540: 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20 20  nt regYield){.  
2550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2560: 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
2570: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
2580: 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  ..  /* Clear the
2590: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
25a0: 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72 65  ter cache, there
25b0: 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  by ensuring that
25c0: 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f   each.  ** co-ro
25d0: 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f 77  utine has its ow
25e0: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  n independent se
25f0: 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c 20  t of registers, 
2600: 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74 69  because co-routi
2610: 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65  nes.  ** might e
2620: 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67 69  xpect their regi
2630: 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65 73  sters to be pres
2640: 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e 20  erved across an 
2650: 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20  OP_Yield, and.  
2660: 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63 61  ** that could ca
2670: 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66 20  use problems if 
2680: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72  two or more co-r
2690: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69 6e  outines are usin
26a0: 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20  g the same.  ** 
26b0: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
26c0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50  er..  */.  v->pP
26d0: 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
26e0: 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d   0;.  v->pParse-
26f0: 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2700: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2710: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
2720: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
2730: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
2740: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
2750: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
2760: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
2770: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
2780: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
2790: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
27a0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
27b0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
27c0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
27d0: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
27e0: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
27f0: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
2800: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
2810: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
2820: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
2830: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
2840: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
2850: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
2860: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
2870: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
2880: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
2890: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
28a0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
28b0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
28c0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
28d0: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
28e0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
28f0: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
2900: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
2910: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
2920: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
2930: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
2940: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
2950: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
2960: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2970: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
2980: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2990: 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a  Label(Vdbe *v){.
29a0: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
29b0: 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20  pParse;.  int i 
29c0: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
29d0: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
29e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
29f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26  IT );.  if( (i &
2a00: 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20   (i-1))==0 ){.  
2a10: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71    p->aLabel = sq
2a20: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
2a30: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
2a40: 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20  Label, .        
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a70: 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d  i*2+1)*sizeof(p-
2a80: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
2a90: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
2aa0: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
2ab0: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
2ac0: 20 20 72 65 74 75 72 6e 20 41 44 44 52 28 69 29    return ADDR(i)
2ad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
2ae0: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
2af0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
2b00: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
2b10: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
2b20: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
2b30: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
2b40: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2b50: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
2b60: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
2b70: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2b80: 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  l()..*/.void sql
2b90: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2ba0: 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e  abel(Vdbe *v, in
2bb0: 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  t x){.  Parse *p
2bc0: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2bd0: 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b  int j = ADDR(x);
2be0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2bf0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2c00: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
2c10: 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  ( j<p->nLabel );
2c20: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
2c30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
2c40: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
2c50: 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b  bel[j] = v->nOp;
2c60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
2c70: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
2c80: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
2c90: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
2ca0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2cb0: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
2cc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
2cd0: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
2ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74  .}../*.** Mark t
2cf0: 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74  he VDBE as one t
2d00: 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  hat can only be 
2d10: 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  run multiple tim
2d20: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2d30: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
2d40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
2d50: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a  unOnlyOnce = 0;.
2d60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2d70: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
2d80: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2d90: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
2da0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2db0: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
2dc0: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
2dd0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
2de0: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
2df0: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
2e00: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
2e10: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
2e20: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
2e30: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
2e40: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
2e50: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
2e60: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
2e70: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
2e80: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
2e90: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
2ea0: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
2eb0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
2ec0: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
2ed0: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
2f00: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
2f10: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
2f20: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
2f30: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
2f40: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
2f50: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
2f60: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
2f70: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
2f80: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
2f90: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
2fa0: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
2fb0: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
2fc0: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
2ff0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
3000: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
3010: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
3020: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
3030: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
3040: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3060: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3070: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
3080: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
30b0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
30c0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
30d0: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
30e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
30f0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
3100: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
3110: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
3120: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
3130: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
3140: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
3150: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
3160: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
3170: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
3180: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
3190: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
31a0: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
31b0: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
31c0: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
31d0: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
31e0: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
31f0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
3200: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
3210: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
3220: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
3230: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
3240: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
3250: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
3260: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
3270: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
3280: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
3290: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
32a0: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
32b0: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
32c0: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
32d0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
32e0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
32f0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
3300: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
3310: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
3320: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
3330: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
3340: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
3350: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
3360: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
3370: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
3380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3390: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
33a0: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
33b0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
33c0: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
33d0: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
33e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
33f0: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
3400: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
3410: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3420: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
3430: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
3440: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
3450: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3460: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
3470: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
3480: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
3490: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
34a0: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
34b0: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
34c0: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
34d0: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
34e0: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
34f0: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
3500: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
3510: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
3520: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
3530: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
3540: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
3550: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
3560: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
3570: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
3580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
3590: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
35a0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
35b0: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
35c0: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
35d0: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
35e0: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
35f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
3600: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
3610: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
3620: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
3630: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
3640: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
3650: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
3660: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
3670: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
3680: 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20  straint).**   * 
3690: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
36a0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
36b0: 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54 45  tine (for CREATE
36c0: 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54   TABLE AS SELECT
36d0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...).**.** Then
36e0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
36f0: 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d  value of Parse.m
3700: 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20  ayAbort is true 
3710: 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d  if an.** ABORT m
3720: 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72  ay be thrown, or
3730: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
3740: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  . Return true if
3750: 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63   it does.** matc
3760: 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  h, or false othe
3770: 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63  rwise. This func
3780: 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64  tion is intended
3790: 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a   to be used as.*
37a0: 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  * part of an ass
37b0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ert statement in
37c0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53   the compiler. S
37d0: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
37e0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
37f0: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3800: 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64  bort(pParse->pVd
3810: 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41  be, pParse->mayA
3820: 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20  bort) );.*/.int 
3830: 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72  sqlite3VdbeAsser
3840: 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a  tMayAbort(Vdbe *
3850: 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29  v, int mayAbort)
3860: 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74  {.  int hasAbort
3870: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46   = 0;.  int hasF
3880: 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  kCounter = 0;.  
3890: 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62  int hasCreateTab
38a0: 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  le = 0;.  int ha
38b0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
38c0: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
38d0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
38e0: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
38f0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
3900: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
3910: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
3920: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
3930: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
3940: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
3950: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
3960: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
3970: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
3980: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
3990: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
39a0: 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28  ename .     || (
39b0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
39c0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
39d0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
39e0: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
39f0: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
3a00: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
3a10: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
3a20: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
3a30: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
3a40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3a50: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3a60: 43 72 65 61 74 65 54 61 62 6c 65 20 29 20 68 61  CreateTable ) ha
3a70: 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31  sCreateTable = 1
3a80: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
3a90: 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  ==OP_InitCorouti
3aa0: 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f  ne ) hasInitCoro
3ab0: 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64  utine = 1;.#ifnd
3ac0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
3ad0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69  OREIGN_KEY.    i
3ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b  f( opcode==OP_Fk
3af0: 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e  Counter && pOp->
3b00: 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  p1==0 && pOp->p2
3b10: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ==1 ){.      has
3b20: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20  FkCounter = 1;. 
3b30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
3b40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3b50: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
3b60: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
3b70: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
3b80: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
3b90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
3ba0: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
3bb0: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
3bc0: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
3bd0: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
3be0: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
3bf0: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
3c00: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
3c10: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
3c20: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
3c30: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
3c40: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
3c50: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
3c60: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
3c70: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
3c80: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
3c90: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
3ca0: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
3cb0: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
3cc0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c  ort==mayAbort ||
3cd0: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20   hasFkCounter.  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
3cf0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 26  hasCreateTable &
3d00: 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  & hasInitCorouti
3d10: 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ne) );.}.#endif 
3d20: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
3d30: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
3d40: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
3d50: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
3d60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3d70: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c   called after al
3d80: 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62  l opcodes have b
3d90: 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49  een inserted.  I
3da0: 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75  t loops.** throu
3db0: 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64  gh all the opcod
3dc0: 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20  es and fixes up 
3dd0: 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  some details..**
3de0: 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68  .** (1) For each
3df0: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
3e00: 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76  n with a negativ
3e10: 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61  e P2 value (a la
3e20: 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f  bel).**     reso
3e30: 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65  lve the P2 value
3e40: 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64   to an actual ad
3e50: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29  dress..**.** (2)
3e60: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78   Compute the max
3e70: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
3e80: 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79  rguments used by
3e90: 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f   any SQL functio
3ea0: 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f  n.**     and sto
3eb0: 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  re that value in
3ec0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a   *pMaxFuncArgs..
3ed0: 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65  **.** (3) Update
3ee0: 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e   the Vdbe.readOn
3ef0: 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52  ly and Vdbe.bIsR
3f00: 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61  eader flags to a
3f10: 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20  ccurately.**    
3f20: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
3f30: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
3f40: 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64  ement actually d
3f50: 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49  oes..**.** (4) I
3f60: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34  nitialize the p4
3f70: 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  .xAdvance pointe
3f80: 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61  r on opcodes tha
3f90: 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  t use it..**.** 
3fa0: 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20  (5) Reclaim the 
3fb0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
3fc0: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62   for storing lab
3fd0: 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  els..**.** This 
3fe0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
3ff0: 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65  y function corre
4000: 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70  ctly if the mkop
4010: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
4020: 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75  tor.** script nu
4030: 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65  mbers the opcode
4040: 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68  s correctly.  Ch
4050: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f  anges to this ro
4060: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a  utine must be.**
4070: 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74   coordinated wit
4080: 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f  h changes to mko
4090: 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73  pcodeh.tcl..*/.s
40a0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
40b0: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
40c0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
40d0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d  cArgs){.  int nM
40e0: 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75  axArgs = *pMaxFu
40f0: 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f  ncArgs;.  Op *pO
4100: 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p;.  Parse *pPar
4110: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
4120: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
4130: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a  pParse->aLabel;.
4140: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
4150: 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65  1;.  p->bIsReade
4160: 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26  r = 0;.  pOp = &
4170: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
4180: 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20  ;.  while(1){.. 
4190: 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20     /* Only JUMP 
41a0: 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20  opcodes and the 
41b0: 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70  short list of sp
41c0: 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e  ecial opcodes in
41d0: 20 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20   the switch.    
41e0: 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f  ** below need to
41f0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
4200: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
4210: 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72  cl generator scr
4220: 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a  ipt groups.    *
4230: 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f  * all these opco
4240: 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61  des together nea
4250: 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74  r the front of t
4260: 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20  he opcode list. 
4270: 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79   Skip.    ** any
4280: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65   opcode that doe
4290: 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65  s not need proce
42a0: 73 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c  ssing by virtual
42b0: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
42c0: 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c  t.    ** it is l
42d0: 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
42e0: 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45  E_MX_JUMP_OPCODE
42f0: 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  , as a performan
4300: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
4310: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4320: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c  pOp->opcode<=SQL
4330: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
4340: 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  DE ){.      /* N
4350: 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20  OTE: Be sure to 
4360: 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68  update mkopcodeh
4370: 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67  .tcl when adding
4380: 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20   or removing.   
4390: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
43a0: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
43b0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
43c0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
43d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72        case OP_Tr
43e0: 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20  ansaction: {.   
43f0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
4400: 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f  p2!=0 ) p->readO
4410: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4420: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
4430: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
4440: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74       case OP_Aut
4450: 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20  oCommit:.       
4460: 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69   case OP_Savepoi
4470: 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nt: {.          
4480: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
4490: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
44a0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
44b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
44c0: 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73  _WAL.        cas
44d0: 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
44e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
44f0: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
4500: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4510: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20  JournalMode: {. 
4520: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64           p->read
4530: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
4540: 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72      p->bIsReader
4550: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
4560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4580: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4590: 45 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  E.        case O
45a0: 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20  P_VUpdate: {.   
45b0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
45c0: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
45d0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
45e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
45f0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4600: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69       case OP_VFi
4610: 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  lter: {.        
4620: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
4630: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 20     assert( (pOp 
4640: 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29  - p->aOp) >= 3 )
4650: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
4660: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
4670: 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29  de==OP_Integer )
4680: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20  ;.          n = 
4690: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
46a0: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
46b0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
46c0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = n;.          b
46d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
46e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63  #endif.        c
46f0: 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20  ase OP_Next:.   
4700: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
4710: 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 20  tIfOpen:.       
4720: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
4730: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
4740: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
4750: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
4760: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
4770: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
4780: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
4790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
47a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
47b0: 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20  e OP_Prev:.     
47c0: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49     case OP_PrevI
47d0: 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20  fOpen: {.       
47e0: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
47f0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4800: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4810: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4820: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4830: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4840: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4850: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 71   }.      if( (sq
4860: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4870: 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[pOp->opcode]
4880: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
4890: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
48a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
48b0: 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c  ( ADDR(pOp->p2)<
48c0: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29  pParse->nLabel )
48d0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
48e0: 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28  2 = aLabel[ADDR(
48f0: 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20  pOp->p2)];.     
4900: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4910: 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62   pOp==p->aOp ) b
4920: 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b  reak;.    pOp--;
4930: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4940: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72  Free(p->db, pPar
4950: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70  se->aLabel);.  p
4960: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20  Parse->aLabel = 
4970: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61  0;.  pParse->nLa
4980: 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78  bel = 0;.  *pMax
4990: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
49a0: 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rgs;.  assert( p
49b0: 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c  ->bIsReader!=0 |
49c0: 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  | DbMaskAllZero(
49d0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
49e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
49f0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
4a00: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
4a10: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
4a20: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
4a30: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4a40: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
4a50: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4a60: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4a70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
4a80: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65  nOp;.}../*.** Ve
4a90: 72 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61  rify that at lea
4aa0: 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74  st N opcode slot
4ab0: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
4ac0: 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20  in p without.** 
4ad0: 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63  having to malloc
4ae0: 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20   for more space 
4af0: 28 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d  (except when com
4b00: 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53  piled using.** S
4b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
4b20: 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69  OC_STRESS).  Thi
4b30: 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75  s interface is u
4b40: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
4b50: 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20  ng.** to verify 
4b60: 74 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c  that certain cal
4b70: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
4b80: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e  eAddOpList() can
4b90: 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64   never.** fail d
4ba0: 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c  ue to a OOM faul
4bb0: 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74  t and hence that
4bc0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
4bd0: 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  e from.** sqlite
4be0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
4bf0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
4c00: 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  non-NULL..*/.#if
4c10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4c20: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
4c30: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
4c40: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
4c50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
4c60: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
4c70: 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69  uired(Vdbe *p, i
4c80: 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
4c90: 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70   p->nOp + N <= p
4ca0: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
4cb0: 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oc );.}.#endif..
4cc0: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
4cd0: 74 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  t the VM passed 
4ce0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
4cf0: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ment does not co
4d00: 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52  ntain.** an OP_R
4d10: 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e  esultRow opcode.
4d20: 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28   Fail an assert(
4d30: 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68  ) if it does. Th
4d40: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79  is is used.** by
4d50: 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e   code in pragma.
4d60: 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  c to ensure that
4d70: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
4d80: 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a  ion of certain.*
4d90: 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72  * pragmas compor
4da0: 74 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67  ts with the flag
4db0: 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
4dc0: 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74  he mkpragmatab.t
4dd0: 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f  cl.** script..*/
4de0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4df0: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  ITE_DEBUG) && !d
4e00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
4e10: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
4e20: 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  S).void sqlite3V
4e30: 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c  dbeVerifyNoResul
4e40: 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20  tRow(Vdbe *p){. 
4e50: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
4e60: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
4e70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4e80: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
4e90: 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b  =OP_ResultRow );
4ea0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
4eb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4ec0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
4ed0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
4ee0: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
4ef0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
4f00: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
4f10: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
4f20: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
4f30: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
4f40: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
4f50: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
4f60: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
4f70: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
4f80: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
4f90: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
4fa0: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
4fb0: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
4fc0: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
4fd0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
4fe0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
4ff0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
5000: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
5010: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
5020: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
5030: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
5040: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
5050: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
5060: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
5070: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
5080: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
5090: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
50a0: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
50b0: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
50c0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
50d0: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
50e0: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
50f0: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
5100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
5110: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
5120: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
5130: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
5140: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
5150: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
5160: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
5170: 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  /.  assert( DbMa
5180: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
5190: 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65  eeMask) );..  re
51a0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
51b0: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
51c0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
51d0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
51e0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
51f0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
5200: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
5210: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
5220: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
5230: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
5240: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
5250: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
5260: 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50  **.** Non-zero P
5270: 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a  2 arguments to j
5280: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
5290: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
52a0: 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73  ly adjusted.** s
52b0: 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  o that the jump 
52c0: 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69  target is relati
52d0: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
52e0: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
52f0: 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ed..*/.VdbeOp *s
5300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
5310: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ist(.  Vdbe *p, 
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64      /* Add opcod
5340: 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  es to the prepar
5350: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
5360: 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20    int nOp,      
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5380: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f  * Number of opco
5390: 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  des to add */.  
53a0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
53b0: 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20   *aOp,       /* 
53c0: 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  The opcodes to b
53d0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
53e0: 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20   iLineno        
53f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
5400: 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75  rce-file line nu
5410: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70  mber of first op
5420: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
5430: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
5440: 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61  ut, *pFirst;.  a
5450: 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a  ssert( nOp>0 );.
5460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5470: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5480: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
5490: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70  nOp + nOp > p->p
54a0: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
54b0: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
54c0: 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65  , nOp) ){.    re
54d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46  turn 0;.  }.  pF
54e0: 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70  irst = pOut = &p
54f0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20  ->aOp[p->nOp];. 
5500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
5510: 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75   i++, aOp++, pOu
5520: 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  t++){.    pOut->
5530: 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70  opcode = aOp->op
5540: 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  code;.    pOut->
5550: 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = aOp->p1;.  
5560: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70    pOut->p2 = aOp
5570: 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74  ->p2;.    assert
5580: 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( aOp->p2>=0 );.
5590: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
55a0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61  OpcodeProperty[a
55b0: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
55c0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
55d0: 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20  aOp->p2>0 ){.   
55e0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70     pOut->p2 += p
55f0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
5600: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d   pOut->p3 = aOp-
5610: 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p3;.    pOut->p
5620: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5630: 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  ED;.    pOut->p4
5640: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  .p = 0;.    pOut
5650: 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66  ->p5 = 0;.#ifdef
5660: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
5670: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
5680: 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65      pOut->zComme
5690: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
56a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
56b0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70  E_COVERAGE.    p
56c0: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
56d0: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
56e0: 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65  .    (void)iLine
56f0: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  no;.#endif.#ifde
5700: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
5710: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
5720: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
5730: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
5740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5750: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e  PrintOp(0, i+p->
5760: 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70  nOp, &p->aOp[i+p
5770: 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23  ->nOp]);.    }.#
5780: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e  endif.  }.  p->n
5790: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74  Op += nOp;.  ret
57a0: 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23  urn pFirst;.}..#
57b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
57c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
57d0: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
57e0: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
57f0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
5800: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
5810: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
5820: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
5830: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
5840: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
5850: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5870: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
5880: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
5890: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
58b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
58c0: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
58d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
58e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
58f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5900: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
5910: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
5920: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
5930: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5940: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
5950: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
5960: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5980: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
5990: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
59a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
59b0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
59c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
59d0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
59e0: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
59f0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
5a00: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
5a10: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
5a20: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
5a30: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
5a40: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
5a50: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
5a60: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
5a70: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
5a80: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
5a90: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
5aa0: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
5ab0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
5ac0: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
5ad0: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
5ae0: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
5af0: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
5b00: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
5b10: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
5b20: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
5b30: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
5b40: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
5b50: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
5b60: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
5b70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
5b80: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5b90: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  e value of the o
5ba0: 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32  pcode, or P1, P2
5bb0: 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72  , P3, or P5 oper
5bc0: 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70  ands.** for a sp
5bd0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
5be0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5bf0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
5c00: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32  ode(Vdbe *p, u32
5c10: 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70   addr, u8 iNewOp
5c20: 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  code){.  sqlite3
5c30: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5c40: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77  )->opcode = iNew
5c50: 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73  Opcode;.}.void s
5c60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5c70: 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P1(Vdbe *p, u32 
5c80: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
5c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
5ca0: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d  Op(p,addr)->p1 =
5cb0: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
5cc0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
5cd0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5ce0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
5cf0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5d00: 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76  (p,addr)->p2 = v
5d10: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
5d20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
5d30: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
5d40: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
5d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5d60: 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c  ,addr)->p3 = val
5d70: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5d80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
5d90: 65 20 2a 70 2c 20 75 38 20 70 35 29 7b 0a 20 20  e *p, u8 p5){.  
5da0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5db0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
5dc0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
5dd0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61   p->nOp>0 ) p->a
5de0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
5df0: 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  = p5;.}../*.** C
5e00: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
5e10: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
5e20: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
5e30: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
5e40: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
5e50: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
5e60: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
5e70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5e80: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
5e90: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
5ea0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  {.  sqlite3VdbeC
5eb0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
5ec0: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
5ed0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
5ee0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
5ef0: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
5f00: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
5f10: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
5f20: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
5f30: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
5f40: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
5f50: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
5f60: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
5f70: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
5f80: 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65  Def){.  if( (pDe
5f90: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
5fa0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
5fb0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
5fc0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
5fd0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
5fe0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
5ff0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
6000: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
6010: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
6020: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
6030: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
6040: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
6050: 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73  void freeP4Mem(s
6060: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20  qlite3 *db, Mem 
6070: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  *p){.  if( p->sz
6080: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
6090: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
60a0: 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65  alloc);.  sqlite
60b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
60c0: 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  }.static SQLITE_
60d0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
60e0: 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c 69  eeP4FuncCtx(sqli
60f0: 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33  te3 *db, sqlite3
6100: 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20  _context *p){.  
6110: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
6120: 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75  ction(db, p->pFu
6130: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  nc);.  sqlite3Db
6140: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 73  Free(db, p);.}.s
6150: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
6160: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
6170: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
6180: 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28 20  *p4){.  assert( 
6190: 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  db );.  switch( 
61a0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
61b0: 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b  se P4_FUNCCTX: {
61c0: 0a 20 20 20 20 20 20 66 72 65 65 50 34 46 75 6e  .      freeP4Fun
61d0: 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74 65  cCtx(db, (sqlite
61e0: 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a  3_context*)p4);.
61f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6200: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
6210: 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50 34  EAL:.    case P4
6220: 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73 65  _INT64:.    case
6230: 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20   P4_DYNAMIC:.   
6240: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
6250: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
6260: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
6270: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6280: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6290: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
62a0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
62b0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
62c0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
62d0: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
62e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
62f0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
6300: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
6310: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f  NTS.    case P4_
6320: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  EXPR: {.      sq
6330: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6340: 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a  db, (Expr*)p4);.
6350: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6360: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
6370: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
6380: 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d  .      freeEphem
6390: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c  eralFunction(db,
63a0: 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a   (FuncDef*)p4);.
63b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
63c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
63d0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EM: {.      if( 
63e0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
63f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
6400: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
6410: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
6420: 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p4);.      }else
6430: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 34  {.        freeP4
6440: 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34  Mem(db, (Mem*)p4
6450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6470: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
6480: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d   {.      if( db-
6490: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
64a0: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
64b0: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
64c0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
64d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
64e0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61  .** Free the spa
64f0: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
6500: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20   aOp and any p4 
6510: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64  values allocated
6520: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f   for the.** opco
6530: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  des contained wi
6540: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20  thin. If aOp is 
6550: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61  not NULL it is a
6560: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
6570: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65  n .** nOp entrie
6580: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
6590: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
65a0: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ay(sqlite3 *db, 
65b0: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70  Op *aOp, int nOp
65c0: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a  ){.  if( aOp ){.
65d0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
65e0: 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f   for(pOp=aOp; pO
65f0: 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70  p<&aOp[nOp]; pOp
6600: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
6610: 4f 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72 65  Op->p4type ) fre
6620: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
6630: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
6640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6650: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
6660: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
6670: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6680: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
6690: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
66a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
66b0: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
66c0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
66d0: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
66e0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
66f0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6700: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
6710: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
6720: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
6730: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
6740: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
6750: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
6760: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
6770: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
6780: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
6790: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
67a0: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
67b0: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
67c0: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
67d0: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
67e0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
67f0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
6800: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
6810: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
6820: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69  nto OP_Noop.*/.i
6830: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
6840: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
6850: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
6860: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
6870: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
6880: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
6890: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   0;.  assert( ad
68a0: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
68b0: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20  >nOp );.  pOp = 
68c0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
68d0: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
68e0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
68f0: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
6900: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
6910: 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ED;.  pOp->p4.z 
6920: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  = 0;.  pOp->opco
6930: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
6940: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
6950: 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f  ** If the last o
6960: 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e  pcode is "op" an
6970: 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75  d it is not a ju
6980: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a  mp destination,.
6990: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69  ** then remove i
69a0: 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
69b0: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
69c0: 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d  n opcode was rem
69d0: 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
69e0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
69f0: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
6a00: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
6a10: 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e   p->nOp>0 && p->
6a20: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70  aOp[p->nOp-1].op
6a30: 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20  code==op ){.    
6a40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
6a50: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70  beChangeToNoop(p
6a60: 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d  , p->nOp-1);.  }
6a70: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6a80: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
6a90: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
6aa0: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
6ab0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
6ac0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
6ad0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ae0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
6af0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
6b00: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
6b10: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
6b20: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
6b30: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
6b40: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
6b50: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
6b60: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
6b70: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
6b80: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
6b90: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
6ba0: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
6bb0: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
6bc0: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
6bd0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
6be0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
6bf0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
6c00: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
6c10: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
6c20: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
6c30: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
6c40: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
6c50: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
6c60: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
6c70: 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f  of zP4..** .** O
6c80: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
6c90: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
6ca0: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
6cb0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
6cc0: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
6cd0: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
6ce0: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
6cf0: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
6d00: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
6d10: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
6d20: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
6d30: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
6d40: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
6d50: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
6d60: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
6d70: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
6d80: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
6d90: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
6da0: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49   void SQLITE_NOI
6db0: 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67 65  NLINE vdbeChange
6dc0: 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a  P4Full(.  Vdbe *
6dd0: 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20  p,.  Op *pOp,.  
6de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
6df0: 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66  .  int n.){.  if
6e00: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
6e10: 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64  .    freeP4(p->d
6e20: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
6e30: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
6e40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b  pOp->p4type = 0;
6e50: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
6e60: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c   0;.  }.  if( n<
6e70: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6e80: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
6e90: 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61  (int)(pOp - p->a
6ea0: 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  Op), zP4, n);.  
6eb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
6ec0: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
6ed0: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
6ee0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
6ef0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
6f00: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
6f10: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
6f20: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
6f30: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6f40: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
6f50: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
6f60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
6f70: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
6f80: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
6f90: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
6fa0: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
6fb0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
6fc0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
6fd0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
6fe0: 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c  ert( p->aOp!=0 |
6ff0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
7000: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
7010: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
7020: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54      if( n!=P4_VT
7030: 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  AB ) freeP4(db, 
7040: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
7050: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72 65  **)&zP4);.    re
7060: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
7070: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
7080: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
7090: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
70a0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
70b0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
70c0: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
70d0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
70e0: 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34   n>=0 || pOp->p4
70f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62 65  type ){.    vdbe
7100: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20  ChangeP4Full(p, 
7110: 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  pOp, zP4, n);.  
7120: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7130: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
7140: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
7150: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
7160: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
7170: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
7180: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
7190: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
71a0: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
71b0: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
71c0: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
71d0: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
71e0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
71f0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
7200: 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30 20  else if( zP4!=0 
7210: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
7220: 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 );.    pOp->p
7230: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
7240: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
7250: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
7260: 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50  )n;.    if( n==P
7270: 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65 33  4_VTAB ) sqlite3
7280: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
7290: 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  *)zP4);.  }.}../
72a0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
72b0: 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P4 operand of th
72c0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
72d0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
72e0: 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c  n .** to the val
72f0: 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ue defined by th
7300: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
7310: 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70 65  is is a high-spe
7320: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
7330: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7340: 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  geP4()..**.** Th
7350: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75 73  e P4 operand mus
7360: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
7370: 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69 6e  previously defin
7380: 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65 77  ed.  And the new
7390: 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74 20  .** P4 must not 
73a0: 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55 73  be P4_INT32.  Us
73b0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
73c0: 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68 65  ngeP4() in eithe
73d0: 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61  r of.** those ca
73e0: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
73f0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
7400: 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a  (Vdbe *p, void *
7410: 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56  pP4, int n){.  V
7420: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  dbeOp *pOp;.  as
7430: 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33  sert( n!=P4_INT3
7440: 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20  2 && n!=P4_VTAB 
7450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d  );.  assert( n<=
7460: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  0 );.  if( p->db
7470: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7480: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
7490: 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d  db, n, pP4);.  }
74a0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
74b0: 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20 20  ( pP4!=0 );.    
74c0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
74d0: 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 70   );.    pOp = &p
74e0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
74f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
7500: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
7510: 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d  USED );.    pOp-
7520: 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20  >p4type = n;.   
7530: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34   pOp->p4.p = pP4
7540: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
7550: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
7560: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
7570: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
7580: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
7590: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
75a0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
75b0: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
75c0: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
75d0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
75e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
75f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79  se->pVdbe;.  Key
7600: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
7610: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
7620: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
7630: 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66  !=0 );.  pKeyInf
7640: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
7650: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
7660: 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20 70  , pIdx);.  if( p
7670: 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74 65  KeyInfo ) sqlite
7680: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
7690: 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45   pKeyInfo, P4_KE
76a0: 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65  YINFO);.}..#ifde
76b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
76c0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
76d0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
76e0: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
76f0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
7700: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
7710: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
7720: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
7730: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
7740: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
7750: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
7760: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
7770: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
7780: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
7790: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
77a0: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
77b0: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
77c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
77d0: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
77e0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
77f0: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
7800: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
7810: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
7820: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
7830: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
7840: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
7850: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
7860: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7870: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
7880: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
7890: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
78a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
78b0: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
78c0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
78d0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
78e0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
78f0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
7900: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
7910: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
7920: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
7930: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
7940: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
7950: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
7960: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
7970: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
7980: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
7990: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
79a0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
79b0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
79c0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
79d0: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
79e0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
79f0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
7a00: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
7a10: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7a20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7a30: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
7a40: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
7a50: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
7a60: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
7a70: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
7a80: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
7a90: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
7aa0: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
7ab0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
7ac0: 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  RAGE./*.** Set t
7ad0: 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  he value if the 
7ae0: 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66  iSrcLine field f
7af0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  or the previousl
7b00: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
7b10: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7b20: 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e  ite3VdbeSetLineN
7b30: 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69  umber(Vdbe *v, i
7b40: 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c  nt iLine){.  sql
7b50: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
7b60: 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  -1)->iSrcLine = 
7b70: 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  iLine;.}.#endif 
7b80: 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  /* SQLITE_VDBE_C
7b90: 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a  OVERAGE */../*.*
7ba0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
7bb0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
7bc0: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
7bd0: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
7be0: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
7bf0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
7c00: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
7c10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
7c20: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
7c30: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
7c40: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
7c50: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
7c60: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
7c70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
7c80: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
7c90: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
7ca0: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
7cb0: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
7cc0: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
7cd0: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
7ce0: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
7cf0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
7d00: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
7d10: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
7d20: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
7d30: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
7d40: 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74  ter an OOM fault
7d50: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
7d60: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
7d70: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
7d80: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
7d90: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
7da0: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
7db0: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
7dc0: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
7dd0: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
7de0: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
7df0: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
7e00: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
7e10: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
7e20: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
7e30: 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ind..*/.VdbeOp *
7e40: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
7e50: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
7e60: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
7e70: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
7e80: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
7e90: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
7ea0: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
7eb0: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
7ec0: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
7ed0: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
7ee0: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
7ef0: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
7f00: 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f  VdbeOp dummy;  /
7f10: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56  * Ignore the MSV
7f20: 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  C warning about 
7f30: 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  no initializer *
7f40: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  /.  assert( p->m
7f50: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
7f60: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61  _INIT );.  if( a
7f70: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
7f80: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
7f90: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
7fa0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
7fb0: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
7fc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7fd0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
7fe0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
7ff0: 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70    return (VdbeOp
8000: 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  *)&dummy;.  }els
8010: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
8020: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
8030: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
8040: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
8050: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a  PLAIN_COMMENTS).
8060: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
8070: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
8080: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72  r one of the par
8090: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ameters to the o
80a0: 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74  pcode pOp.** det
80b0: 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61  ermined by chara
80c0: 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69  cter c..*/.stati
80d0: 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50  c int translateP
80e0: 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f  (char c, const O
80f0: 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63  p *pOp){.  if( c
8100: 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 70  =='1' ) return p
8110: 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d  Op->p1;.  if( c=
8120: 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='2' ) return pO
8130: 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p2;.  if( c==
8140: 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '3' ) return pOp
8150: 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p3;.  if( c=='
8160: 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  4' ) return pOp-
8170: 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  >p4.i;.  return 
8180: 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  pOp->p5;.}../*.*
8190: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
81a0: 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d  ng for the "comm
81b0: 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20  ent" field of a 
81c0: 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74  VDBE opcode list
81d0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ing..**.** The S
81e0: 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69  ynopsis: field i
81f0: 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  n comments in th
8200: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
8210: 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72  file gets conver
8220: 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74  ted.** to an ext
8230: 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69  ra string that i
8240: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
8250: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
8260: 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a  ame().  In the.*
8270: 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68  * absence of oth
8280: 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69  er comments, thi
8290: 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d  s synopsis becom
82a0: 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  es the comment o
82b0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a  n the opcode..**
82c0: 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f   Some translatio
82d0: 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20  n occurs:.**.** 
82e0: 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20 20        "PX"      
82f0: 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20  ->  "r[X]".**   
8300: 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e      "PX@PY"   ->
8310: 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20    "r[X..X+Y-1]" 
8320: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
8330: 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20  is 0 or 1.**    
8340: 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20     "PX@PY+1" -> 
8350: 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20   "r[X..X+Y]"    
8360: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69  or "r[x]" if y i
8370: 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59  s 0.**       "PY
8380: 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e  ..PY"  ->  "r[X.
8390: 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b  .Y]"      or "r[
83a0: 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73  x]" if y<=x.*/.s
83b0: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
83c0: 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73  yComment(.  cons
83d0: 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f  t Op *pOp,     /
83e0: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  * The opcode to 
83f0: 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a  be commented */.
8400: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8410: 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  4,   /* Previous
8420: 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75  ly obtained valu
8430: 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68  e for P4 */.  ch
8440: 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20  ar *zTemp,      
8450: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
8460: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
8470: 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a  Temp          /*
8480: 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
8490: 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29   in zTemp[] */.)
84a0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
84b0: 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  zOpName;.  const
84c0: 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73   char *zSynopsis
84d0: 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b  ;.  int nOpName;
84e0: 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20  .  int ii, jj;. 
84f0: 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a   char zAlt[50];.
8500: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
8510: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
8520: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
8530: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
8540: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
8550: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
8560: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
8570: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
8580: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
8590: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
85a0: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
85b0: 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73  e + 1;.    if( s
85c0: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
85d0: 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"IF ",3)==0 ){.
85e0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
85f0: 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  5 & SQLITE_STORE
8600: 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  P2 ){.        sq
8610: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
8620: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c  izeof(zAlt), zAl
8630: 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29  t, "r[P2] = (%s)
8640: 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b  ", zSynopsis+3);
8650: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8670: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
8680: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25  lt), zAlt, "if %
8690: 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e  s goto P2", zSyn
86a0: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
86b0: 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69  }.      zSynopsi
86c0: 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a  s = zAlt;.    }.
86d0: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
86e0: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
86f0: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
8700: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
8710: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
8720: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
8730: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
8740: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
8750: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
8760: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8770: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
8780: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
8790: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
87a0: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
87b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
87c0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
87d0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
87e0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
87f0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
8800: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
8810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8820: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
8830: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
8840: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
8850: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8860: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8870: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
8880: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
8890: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
88a0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
88b0: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
88c0: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
88d0: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
88e0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
88f0: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
8900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
8910: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
8920: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
8930: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
8940: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
8950: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
8960: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8970: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
8980: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
8990: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
89b0: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
89c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
89d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
89e0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
89f0: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
8a00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8a10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
8a20: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
8a30: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
8a40: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
8a50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8a60: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
8a70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8a80: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
8a90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8aa0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
8ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
8ac0: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
8ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8ae0: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
8af0: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
8b00: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
8b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
8b20: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
8b30: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
8b40: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
8b50: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
8b60: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8b70: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
8b80: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
8b90: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
8ba0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
8bb0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
8bc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8bd0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8be0: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
8bf0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
8c00: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8c10: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
8c20: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
8c30: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
8c40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
8c50: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8c60: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23  LITE_DEBUG */..#
8c70: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
8c80: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
8c90: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
8ca0: 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  OR_HINTS)./*.** 
8cb0: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34  Translate the P4
8cc0: 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72  .pExpr value for
8cd0: 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e   an OP_CursorHin
8ce0: 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65  t opcode into te
8cf0: 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  xt.** that can b
8d00: 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74  e displayed in t
8d10: 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20  he P4 column of 
8d20: 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a  EXPLAIN output..
8d30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
8d40: 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74 72  isplayP4Expr(Str
8d50: 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a  Accum *p, Expr *
8d60: 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20  pExpr){.  const 
8d70: 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20  char *zOp = 0;. 
8d80: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
8d90: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
8da0: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  K_STRING:.      
8db0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8dc0: 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  , "%Q", pExpr->u
8dd0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
8de0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8df0: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
8e00: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8e10: 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d  (p, "%d", pExpr-
8e20: 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20  >u.iValue);.    
8e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8e40: 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20  e TK_NULL:.     
8e50: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
8e60: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
8e70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8e80: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
8e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
8ea0: 72 69 6e 74 66 28 70 2c 20 22 72 5b 25 64 5d 22  rintf(p, "r[%d]"
8eb0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
8ec0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8ed0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8ee0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
8ef0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
8f00: 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
8f10: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
8f20: 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20  p, "rowid");.   
8f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f40: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8f50: 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29  (p, "c%d", (int)
8f60: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
8f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
8f80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8f90: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
8fa0: 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20   zOp = "LT";    
8fb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8fc0: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f  e TK_LE:      zO
8fd0: 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62  p = "LE";      b
8fe0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8ff0: 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_GT:      zOp =
9000: 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61   "GT";      brea
9010: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
9020: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  E:      zOp = "G
9030: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
9040: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
9050: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b       zOp = "NE";
9060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9070: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20   case TK_EQ:    
9080: 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20    zOp = "EQ";   
9090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
90a0: 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a  se TK_IS:      z
90b0: 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20  Op = "IS";      
90c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
90d0: 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20  TK_ISNOT:   zOp 
90e0: 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65  = "ISNOT";   bre
90f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9100: 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  AND:     zOp = "
9110: 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  AND";     break;
9120: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
9130: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22        zOp = "OR"
9140: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9150: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
9160: 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20     zOp = "ADD"; 
9170: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9180: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
9190: 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20  zOp = "MUL";    
91a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
91b0: 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70   TK_MINUS:   zOp
91c0: 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72   = "SUB";     br
91d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
91e0: 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _REM:     zOp = 
91f0: 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b  "REM";     break
9200: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
9210: 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49  TAND:  zOp = "BI
9220: 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  TAND";  break;. 
9230: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
9240: 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52  :   zOp = "BITOR
9250: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9260: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20  case TK_SLASH:  
9270: 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20   zOp = "DIV";   
9280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9290: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f  e TK_LSHIFT:  zO
92a0: 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62  p = "LSHIFT";  b
92b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
92c0: 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_RSHIFT:  zOp =
92d0: 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61   "RSHIFT";  brea
92e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  k;.    case TK_C
92f0: 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43  ONCAT:  zOp = "C
9300: 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ONCAT";  break;.
9310: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
9320: 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55  US:  zOp = "MINU
9330: 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  S";   break;.   
9340: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
9350: 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20    zOp = "PLUS"; 
9360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9370: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a  se TK_BITNOT:  z
9380: 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20  Op = "BITNOT";  
9390: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
93a0: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20  TK_NOT:     zOp 
93b0: 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65  = "NOT";     bre
93c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
93d0: 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22  ISNULL:  zOp = "
93e0: 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b  ISNULL";  break;
93f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
9400: 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54  NULL: zOp = "NOT
9410: 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20  NULL"; break;.. 
9420: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
9430: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9440: 28 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22  (p, "%s", "expr"
9450: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9460: 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29    }..  if( zOp )
9470: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
9480: 69 6e 74 66 28 70 2c 20 22 25 73 28 22 2c 20 7a  intf(p, "%s(", z
9490: 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79  Op);.    display
94a0: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
94b0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28  >pLeft);.    if(
94c0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
94d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
94e0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c  trAccumAppend(p,
94f0: 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ",", 1);.      
9500: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c  displayP4Expr(p,
9510: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
9520: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9530: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
9540: 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d  (p, ")", 1);.  }
9550: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42  .}.#endif /* VDB
9560: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20  E_DISPLAY_P4 && 
9570: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9580: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
9590: 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42  TS) */...#if VDB
95a0: 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a  E_DISPLAY_P4./*.
95b0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
95c0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
95d0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
95e0: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
95f0: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
9600: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
9610: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
9620: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
9630: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
9640: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
9650: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
9660: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
9670: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41   = zTemp;.  StrA
9680: 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65 72 74  ccum x;.  assert
9690: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
96a0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
96b0: 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d  Init(&x, 0, zTem
96c0: 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20  p, nTemp, 0);.  
96d0: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
96e0: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
96f0: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
9700: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
9710: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
9720: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
9730: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  yInfo;.      ass
9740: 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
9750: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
9760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9770: 69 6e 74 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  intf(&x, "k(%d",
9780: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
9790: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  d);.      for(j=
97a0: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
97b0: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
97c0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
97d0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
97e0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
97f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
9800: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  oll = pColl ? pC
9810: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b  oll->zName : "";
9820: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
9830: 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41  cmp(zColl, "BINA
9840: 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20  RY")==0 ) zColl 
9850: 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73  = "B";.        s
9860: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9870: 2c 20 22 2c 25 73 25 73 22 2c 20 70 4b 65 79 49  , ",%s%s", pKeyI
9880: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
9890: 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  j] ? "-" : "", z
98a0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Coll);.      }. 
98b0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
98c0: 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22  ccumAppend(&x, "
98d0: 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  )", 1);.      br
98e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  eak;.    }.#ifde
98f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9900: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
9910: 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b   case P4_EXPR: {
9920: 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34  .      displayP4
9930: 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34  Expr(&x, pOp->p4
9940: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62  .pExpr);.      b
9950: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9960: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43  if.    case P4_C
9970: 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20  OLLSEQ: {.      
9980: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
9990: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a   pOp->p4.pColl;.
99a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
99b0: 69 6e 74 66 28 26 78 2c 20 22 28 25 2e 32 30 73  intf(&x, "(%.20s
99c0: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
99d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
99e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
99f0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
9a00: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
9a10: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
9a20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  ;.      sqlite3X
9a30: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25  Printf(&x, "%s(%
9a40: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
9a50: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
9a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a70: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
9a80: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
9a90: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
9aa0: 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50 34  ILE).    case P4
9ab0: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
9ac0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
9ad0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e  = pOp->p4.pCtx->
9ae0: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
9af0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
9b00: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
9b10: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
9b20: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
9b30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9b40: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
9b50: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9b60: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c  XPrintf(&x, "%ll
9b70: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
9b80: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
9b90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9ba0: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
9bb0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9bc0: 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  (&x, "%d", pOp->
9bd0: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
9be0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9bf0: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9c10: 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20  tf(&x, "%.16g", 
9c20: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
9c30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9c40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
9c50: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
9c60: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
9c70: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
9c80: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9c90: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
9ca0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
9cb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9cc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9cd0: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
9ce0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9cf0: 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  (&x, "%lld", pMe
9d00: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
9d10: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
9d20: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
9d30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9d40: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
9d50: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
9d60: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
9d70: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
9d80: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
9d90: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
9da0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
9db0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9dc0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9dd0: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
9de0: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
9df0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9e00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
9e10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9e20: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
9e30: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
9e40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9e50: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
9e60: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
9e70: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
9e80: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76 74  3XPrintf(&x, "vt
9e90: 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a  ab:%p", pVtab);.
9ea0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9eb0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
9ec0: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
9ed0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
9ee0: 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70       int *ai = p
9ef0: 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20  Op->p4.ai;.     
9f00: 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20   int n = ai[0]; 
9f10: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65    /* The first e
9f20: 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54  lement of an INT
9f30: 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20  ARRAY is always 
9f40: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
9f50: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f             ** co
9f60: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
9f70: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f  r of elements to
9f80: 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20   follow */.     
9f90: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69   for(i=1; i<n; i
9fa0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
9fb0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
9fc0: 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20  ",%d", ai[i]);. 
9fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
9fe0: 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20  mp[0] = '[';.   
9ff0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
a000: 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d 22  umAppend(&x, "]"
a010: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
a020: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a030: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
a040: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
a050: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72 6f  XPrintf(&x, "pro
a060: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
a070: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a080: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
a090: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
a0a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
a0b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a0c0: 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20  e P4_TABLE: {.  
a0d0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
a0e0: 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70  tf(&x, "%s", pOp
a0f0: 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  ->p4.pTab->zName
a100: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a110: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
a120: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
a130: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
a140: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
a150: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
a160: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
a170: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
a180: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
a190: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
a1a0: 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65  nish(&x);.  asse
a1b0: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
a1c0: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
a1d0: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
a1e0: 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a  PLAY_P4 */../*.*
a1f0: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
a200: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
a210: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
a220: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
a230: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
a240: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
a250: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
a260: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
a270: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
a280: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
a290: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
a2a0: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
a2b0: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
a2c0: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
a2d0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
a2e0: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
a2f0: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
a300: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
a310: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
a320: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
a330: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
a340: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a350: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
a360: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
a370: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
a380: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
a390: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
a3a0: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
a3b0: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
a3c0: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
a3d0: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
a3e0: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
a3f0: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
a400: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
a410: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
a420: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
a430: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
a440: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
a450: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
a460: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a470: 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a  ARED_CACHE)./*.*
a480: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
a490: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
a4a0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
a4b0: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
a4c0: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
a4d0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
a4e0: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
a4f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
a500: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
a510: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
a520: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
a530: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
a540: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
a550: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
a560: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
a570: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
a580: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
a590: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
a5a0: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
a5b0: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
a5c0: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
a5d0: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
a5e0: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
a5f0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
a600: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
a610: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
a620: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
a630: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
a640: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
a650: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
a660: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
a670: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
a680: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
a690: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
a6a0: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
a6b0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
a6c0: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
a6d0: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
a6e0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
a6f0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
a700: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
a710: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
a720: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
a730: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
a740: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
a750: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
a760: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
a770: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
a780: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
a790: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
a7a0: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
a7b0: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
a7c0: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
a7d0: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
a7e0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
a7f0: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
a800: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
a810: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
a820: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
a830: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
a840: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
a850: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
a860: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
a870: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
a880: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
a890: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
a8a0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
a8b0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
a8c0: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
a8d0: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
a8e0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
a8f0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
a900: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
a910: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
a920: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
a930: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
a940: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
a950: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
a960: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
a970: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
a980: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
a990: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
a9a0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
a9b0: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29  nter(aDb[i].pBt)
a9c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
a9d0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
a9e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a9f0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
aa00: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
aa10: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  E>0./*.** Unlock
aa20: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65   all of the btre
aa30: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  es previously lo
aa40: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  cked by a call t
aa50: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  o sqlite3VdbeEnt
aa60: 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er()..*/.static 
aa70: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
aa80: 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56  void vdbeLeave(V
aa90: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
aaa0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
aab0: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
aac0: 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d  t nDb;.  db = p-
aad0: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
aae0: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
aaf0: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
ab00: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
ab10: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
ab20: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
ab30: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
ab40: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
ab50: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
ab60: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
ab70: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
ab80: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
ab90: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
aba0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61   *p){.  if( DbMa
abb0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
abc0: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
abd0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
abe0: 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65  case */.  vdbeLe
abf0: 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  ave(p);.}.#endif
ac00: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
ac10: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
ac20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
ac30: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
ac40: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
ac50: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
ac60: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
ac70: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
ac80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
ac90: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
aca0: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
acb0: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
acc0: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
acd0: 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31  ];.  char zCom[1
ace0: 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  00];.  static co
acf0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
ad00: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
ad10: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33  %4d %4d %4d %-13
ad20: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
ad30: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
ad40: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
ad50: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
ad60: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
ad70: 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20  (zPtr));.#ifdef 
ad80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
ad90: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
ada0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
adb0: 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20  pOp, zP4, zCom, 
adc0: 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23  sizeof(zCom));.#
add0: 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d  else.  zCom[0] =
ade0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   0;.#endif.  /* 
adf0: 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33  NB:  The sqlite3
ae00: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e  OpcodeName() fun
ae10: 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
ae20: 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65  nted by code cre
ae30: 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  ated.  ** by the
ae40: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61   mkopcodeh.awk a
ae50: 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b  nd mkopcodec.awk
ae60: 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65   scripts which e
ae70: 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20  xtract the.  ** 
ae80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
ae90: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
aea0: 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72  ce text */.  fpr
aeb0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
aec0: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
aed0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
aee0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
aef0: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
af00: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
af10: 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a  pOp->p5,.      z
af20: 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73  Com.  );.  fflus
af30: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
af40: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
af50: 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ize an array of 
af60: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a  N Mem element..*
af70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
af80: 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  itMemArray(Mem *
af90: 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65  p, int N, sqlite
afa0: 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67 73  3 *db, u16 flags
afb0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d  ){.  while( (N--
afc0: 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62  )>0 ){.    p->db
afd0: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c   = db;.    p->fl
afe0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
aff0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
b000: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b010: 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53 63  DEBUG.    p->pSc
b020: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e  opyFrom = 0;.#en
b030: 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d  dif.    p++;.  }
b040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
b050: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
b060: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
b070: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b080: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
b090: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
b0a0: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
b0b0: 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e  Mem *pEnd = &p[N
b0c0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
b0d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
b0e0: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
b0f0: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f  reed ){.      do
b100: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
b110: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
b120: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
b130: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
b140: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
b150: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  End );.      ret
b160: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
b170: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
b180: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
b190: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
b1a0: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db );.      asse
b1b0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
b1c0: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
b1d0: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  s(p) );..      /
b1e0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
b1f0: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
b200: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
b210: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
b220: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
b230: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
b240: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
b250: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
b260: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
b270: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
b280: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
b290: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
b2a0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
b2b0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
b2c0: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
b2d0: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
b2e0: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
b2f0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
b300: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
b310: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
b320: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
b330: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
b340: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
b350: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
b360: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
b370: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
b380: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
b390: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
b3a0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
b3b0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
b3c0: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
b3d0: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
b3e0: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
b3f0: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
b400: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
b410: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
b420: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
b430: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
b440: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
b450: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
b460: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
b470: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
b480: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
b490: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
b4a0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
b4b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b4c0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
b4d0: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Agg );.      tes
b4e0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
b4f0: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20  & MEM_Dyn );.   
b500: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
b510: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d  flags & MEM_Fram
b520: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
b530: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
b540: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20  MEM_RowSet );.  
b550: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
b560: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
b570: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
b580: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
b590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
b5a0: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
b5b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
b5c0: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
b5d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b5e0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
b5f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a  );.        p->sz
b600: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
b610: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
b620: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
b630: 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ned;.    }while(
b640: 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20   (++p)<pEnd );. 
b650: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
b660: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
b670: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
b680: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
b690: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
b6a0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
b6b0: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
b6c0: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
b6d0: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
b6e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
b6f0: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
b700: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
b710: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
b720: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
b730: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
b740: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
b750: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
b760: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
b770: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
b780: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
b790: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
b7a0: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
b7b0: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
b7c0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
b7d0: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
b7e0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ;.  sqlite3VdbeD
b7f0: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e  eleteAuxData(p->
b800: 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44  v->db, &p->pAuxD
b810: 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73  ata, -1, 0);.  s
b820: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
b830: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
b840: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b850: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
b860: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
b870: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
b880: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
b890: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
b8a0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
b8b0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
b8c0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
b8d0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
b8e0: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
b8f0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
b900: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
b910: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
b920: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
b930: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
b940: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
b950: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
b960: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
b970: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
b980: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
b990: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
b9a0: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
b9b0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
b9c0: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
b9d0: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
b9e0: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
b9f0: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
ba00: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
ba10: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
ba20: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
ba30: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
ba40: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
ba50: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
ba60: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
ba70: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
ba80: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
ba90: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
baa0: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
bab0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
bac0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
baf0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
bb20: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
bb30: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
bb40: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
bb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bb70: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
bb80: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
bb90: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
bba0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
bbb0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
bbc0: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
bbd0: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
bc00: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
bc10: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
bc20: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bc30: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
bc40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
bc50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
bc60: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bc90: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bca0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bcb0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
bcc0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
bcd0: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
bce0: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
bcf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
bd00: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
bd10: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
bd20: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
bd30: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
bd40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
bd50: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
bd60: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
bd70: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
bd80: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
bd90: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
bda0: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
bdb0: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
bdc0: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
bdd0: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
bde0: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
bdf0: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
be00: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
be10: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
be20: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
be30: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
be40: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
be50: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
be60: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
be70: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
be80: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
be90: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
bea0: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
beb0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
bec0: 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20 2f  EM_BKPT ){.    /
bed0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
bee0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
bef0: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
bf00: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
bf10: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
bf20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
bf30: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
bf40: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  /.    sqlite3Oom
bf50: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
bf60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
bf70: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  OR;.  }..  /* Wh
bf80: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
bf90: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61   output rows rea
bfa0: 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20  ches nRow, that 
bfb0: 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c  means the.  ** l
bfc0: 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73  isting has finis
bfd0: 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  hed and sqlite3_
bfe0: 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65  step() should re
bff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
c000: 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74  ..  ** nRow is t
c010: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
c020: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
c030: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
c040: 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20  , plus.  ** the 
c050: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
c060: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c  r of rows in all
c070: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
c080: 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rams encountered
c090: 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54  .  ** so far.  T
c0a0: 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69  he nRow value wi
c0b0: 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e  ll increase as n
c0c0: 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ew trigger subpr
c0d0: 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20  ograms are.  ** 
c0e0: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74  encountered, but
c0f0: 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e   p->pc will even
c100: 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20  tually catch up 
c110: 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20  to nRow..  */.  
c120: 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  nRow = p->nOp;. 
c130: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
c140: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =1 ){.    /* The
c150: 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20   first 8 memory 
c160: 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66  cells are used f
c170: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
c180: 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20  t.  So we will. 
c190: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72     ** commandeer
c1a0: 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f   the 9th cell to
c1b0: 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20   use as storage 
c1c0: 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20  for an array of 
c1d0: 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20  pointers.    ** 
c1e0: 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72  to trigger subpr
c1f0: 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42  ograms.  The VDB
c200: 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  E is guaranteed 
c210: 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  to have at least
c220: 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e   9.    ** cells.
c230: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
c240: 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20   p->nMem>9 );.  
c250: 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65    pSub = &p->aMe
c260: 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  m[9];.    if( pS
c270: 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c  ub->flags&MEM_Bl
c280: 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ob ){.      /* O
c290: 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  n the first call
c2a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
c2b0: 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f  (), pSub will ho
c2c0: 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69  ld a NULL.  It i
c2d0: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69  s.      ** initi
c2e0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42  alized to a BLOB
c2f0: 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52   by the P4_SUBPR
c300: 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67  OGRAM processing
c310: 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a   logic below */.
c320: 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75        nSub = pSu
c330: 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65  b->n/sizeof(Vdbe
c340: 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20  *);.      apSub 
c350: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
c360: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a  )pSub->z;.    }.
c370: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c380: 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Sub; i++){.     
c390: 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69   nRow += apSub[i
c3a0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
c3b0: 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  }..  do{.    i =
c3c0: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
c3d0: 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d  le( i<nRow && p-
c3e0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70  >explain==2 && p
c3f0: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
c400: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
c410: 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a   if( i>=nRow ){.
c420: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
c430: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
c440: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
c450: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
c460: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
c470: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
c480: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
c490: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
c4a0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
c4b0: 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71  3VdbeError(p, sq
c4c0: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
c4d0: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
c4e0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
c4f0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
c500: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
c510: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
c520: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
c530: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
c540: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
c550: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
c560: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
c570: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
c580: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
c590: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
c5a0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
c5b0: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
c5c0: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
c5d0: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
c5e0: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
c5f0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
c600: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
c610: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
c620: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
c630: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
c640: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
c650: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
c660: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
c670: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
c680: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
c690: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
c6a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
c6b0: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
c6c0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
c6d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
c6e0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
c710: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
c720: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
c730: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c740: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
c750: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
c760: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
c770: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
c780: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
c790: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
c7a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
c7b0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
c7c0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
c7d0: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
c7e0: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
c7f0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
c800: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
c810: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
c820: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
c830: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
c840: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
c850: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
c860: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
c870: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
c880: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
c890: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
c8a0: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
c8b0: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
c8c0: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
c8d0: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
c8e0: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
c8f0: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
c900: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
c910: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
c920: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c930: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
c940: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
c950: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
c960: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
c970: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
c980: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
c990: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
c9a0: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
c9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
c9c0: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
c9d0: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
c9e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
c9f0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
ca00: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
ca10: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
ca20: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
ca30: 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20   nSub!=0) ){.   
ca40: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
ca50: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
ca60: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20  ub->z;.         
ca70: 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d   apSub[nSub++] =
ca80: 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
ca90: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  m;.          pSu
caa0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
cab0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Blob;.          
cac0: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
cad0: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
cae0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  *);.        }.  
caf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
cb00: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
cb10: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
cb20: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
cb50: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
cb60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
cb70: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
cb80: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
cb90: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cbb0: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P2 */.    pMem++
cbc0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
cbd0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
cbe0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
cbf0: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
cc20: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
cc30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
cc40: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
cc50: 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a   100) ){ /* P4 *
cc60: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
cc70: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
cc80: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
cc90: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
cca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
ccb0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
ccc0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
ccd0: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
cce0: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d  pOp, pMem->z, pM
ccf0: 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  em->szMalloc);. 
cd00: 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d     if( zP4!=pMem
cd10: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ->z ){.      pMe
cd20: 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
cd30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
cd40: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
cd50: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
cd60: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
cd70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
cd80: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
cd90: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
cda0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
cdb0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
cdc0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
cdd0: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
cde0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
cdf0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
ce00: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
ce10: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
ce20: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
ce30: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
ce40: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
ce50: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
ce60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ce70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
ce80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ce90: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
cea0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
ceb0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
cec0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ced0: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
cee0: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
cef0: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
cf00: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
cf10: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
cf20: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
cf30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
cf40: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
cf50: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
cf60: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
cf70: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
cf80: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
cf90: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
cfa0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
cfb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cfc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
cfd0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
cfe0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
cff0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
d000: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
d010: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
d020: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
d030: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
d040: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
d050: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
d060: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
d090: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  t */.#endif.    
d0a0: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
d0b0: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
d0c0: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
d0d0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
d0e0: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
d0f0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
d100: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
d110: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
d120: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
d130: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d140: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
d150: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
d160: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
d170: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
d180: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
d190: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
d1a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d1b0: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
d1c0: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
d1d0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
d1e0: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
d1f0: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
d200: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
d210: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
d220: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
d230: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
d240: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
d250: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
d260: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
d270: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
d280: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
d290: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
d2a0: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
d2b0: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
d2c0: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
d2d0: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
d2e0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d2f0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
d300: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
d310: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
d320: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
d330: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
d340: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
d350: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
d360: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
d370: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
d380: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
d390: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
d3a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
d3b0: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
d3c0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
d3d0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
d3e0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
d3f0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
d400: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
d410: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
d420: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
d430: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
d440: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
d450: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
d460: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
d470: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
d480: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
d490: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
d4a0: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
d4b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
d4c0: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
d4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d4e0: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
d4f0: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
d500: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
d510: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d520: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
d530: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
d540: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
d550: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
d560: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
d570: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
d580: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
d590: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
d5a0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
d5b0: 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  */../* An instan
d5c0: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
d5d0: 74 20 64 65 73 63 72 69 62 65 73 20 62 75 6c 6b  t describes bulk
d5e0: 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   memory availabl
d5f0: 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20  e for use.** by 
d600: 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66  subcomponents of
d610: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
d620: 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20 69 73  ement.  Space is
d630: 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a   allocated out.*
d640: 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c 65 53  * of a ReusableS
d650: 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79 20 74  pace object by t
d660: 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28 29 20  he allocSpace() 
d670: 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a  routine below..*
d680: 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61 62 6c  /.struct Reusabl
d690: 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20 2a 70  eSpace {.  u8 *p
d6a0: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
d6b0: 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d  /* Available mem
d6c0: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ory */.  int nFr
d6d0: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee;           /*
d6e0: 20 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   Bytes of availa
d6f0: 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ble memory */.  
d700: 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20 20 20  int nNeeded;    
d710: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79       /* Total by
d720: 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e  tes that could n
d730: 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
d740: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f  */.};../* Try to
d750: 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   allocate nByte 
d760: 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20  bytes of 8-byte 
d770: 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d  aligned bulk mem
d780: 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20  ory for pBuf.** 
d790: 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c  from the Reusabl
d7a0: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20  eSpace object.  
d7b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
d7c0: 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
d7d0: 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73  d.** memory on s
d7e0: 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75  uccess.  If insu
d7f0: 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20  fficient memory 
d800: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
d810: 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53  the.** ReusableS
d820: 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63  pace object, inc
d830: 72 65 61 73 65 20 74 68 65 20 52 65 75 73 61 62  rease the Reusab
d840: 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a  leSpace.nNeeded.
d850: 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65 20  ** value by the 
d860: 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e  amount needed an
d870: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
d880: 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20  *.** If pBuf is 
d890: 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  not initially NU
d8a0: 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  LL, that means t
d8b0: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68  hat the memory h
d8c0: 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
d8d0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  en allocated by 
d8e0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
d8f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f  this routine, so
d900: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63   just return a c
d910: 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61  opy.** of pBuf a
d920: 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c  nd leave Reusabl
d930: 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64  eSpace unchanged
d940: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c  ..**.** This all
d950: 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79  ocator is employ
d960: 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20  ed to repurpose 
d970: 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20  unused slots at 
d980: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
d990: 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f  * opcode array o
d9a0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
d9b0: 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72   for other memor
d9c0: 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70  y needs of the p
d9d0: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
d9e0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
d9f0: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
da00: 28 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61  (.  struct Reusa
da10: 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a  bleSpace *p,  /*
da20: 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61   Bulk memory ava
da30: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
da40: 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ation */.  void 
da50: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
da60: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
da70: 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63  to a prior alloc
da80: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
da90: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
daa0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
dab0: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a   memory needed *
dac0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
dad0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
dae0: 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29  ENT(p->pSpace) )
daf0: 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
db00: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52  ){.    nByte = R
db10: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20  OUND8(nByte);.  
db20: 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70    if( nByte <= p
db30: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ->nFree ){.     
db40: 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79   p->nFree -= nBy
db50: 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  te;.      pBuf =
db60: 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e   &p->pSpace[p->n
db70: 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  Free];.    }else
db80: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64  {.      p->nNeed
db90: 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ed += nByte;.   
dba0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
dbb0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
dbc0: 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20  NMENT(pBuf) );. 
dbd0: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
dbe0: 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68  ./*.** Rewind th
dbf0: 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74  e VDBE back to t
dc00: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20  he beginning in 
dc10: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a  preparation for.
dc20: 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a  ** running it..*
dc30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
dc40: 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70  beRewind(Vdbe *p
dc50: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
dc60: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
dc70: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
dc80: 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
dc90: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
dca0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
dcb0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
dcc0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70  _MAGIC_INIT || p
dcd0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
dce0: 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20  GIC_RESET );..  
dcf0: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
dd00: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
dd10: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
dd20: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
dd30: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
dd40: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
dd50: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
dd60: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
dd70: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
dd80: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
dd90: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
dda0: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
ddb0: 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  0; i<p->nMem; i+
ddc0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
ddd0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
dde0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
ddf0: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
de00: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
de10: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
de20: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
de30: 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  t;.  p->nChange 
de40: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
de50: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
de60: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
de70: 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61  = 255;.  p->iSta
de80: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  tement = 0;.  p-
de90: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d  >nFkConstraint =
dea0: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
deb0: 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d  PROFILE.  for(i=
dec0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
ded0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  ){.    p->aOp[i]
dee0: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  .cnt = 0;.    p-
def0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
df00: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
df10: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
df20: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
df30: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20  e for execution 
df40: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
df50: 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61  me after.** crea
df60: 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c  ting the virtual
df70: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20   machine.  This 
df80: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
df90: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
dfa0: 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20  ating registers 
dfb0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
dfc0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
dfd0: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
dfe0: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
dff0: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
e000: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
e010: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
e020: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
e030: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
e040: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
e050: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61  ay be called exa
e060: 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63  ctly once on eac
e070: 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  h virtual machin
e080: 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  e..** After this
e090: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e0a0: 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  ed the VM has be
e0b0: 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e  en "packaged" an
e0c0: 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f  d is ready.** to
e0d0: 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69   run.  After thi
e0e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e0f0: 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c  led, further cal
e100: 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
e110: 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e  3VdbeAddOp() fun
e120: 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69  ctions are prohi
e130: 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75  bited.  This rou
e140: 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73  tine disconnects
e150: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f  .** the Vdbe fro
e160: 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
e170: 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67  ct that helped g
e180: 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68  enerate it so th
e190: 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64  at the.** the Vd
e1a0: 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e  be becomes an in
e1b0: 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79  dependent entity
e1c0: 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f   and the Parse o
e1d0: 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20  bject can be.** 
e1e0: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
e1f0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
e200: 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f  VdbeRewind() pro
e210: 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72  cedure to restor
e220: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
e230: 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69  ine back.** to i
e240: 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65  ts initial state
e250: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
e260: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  en run..*/.void 
e270: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
e280: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
e2b0: 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  BE */.  Parse *p
e2c0: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
e2d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e2e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
e2f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
e320: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
e330: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
e360: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ameters */.  int
e370: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
e380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e390: 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f  umber of VM memo
e3a0: 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ry registers */.
e3b0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
e3e0: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a  rsors required *
e3f0: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e420: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62  arguments in sub
e430: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
e440: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e460: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
e470: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
e480: 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20 20  eSpace x;       
e490: 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c   /* Reusable bul
e4a0: 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61  k memory */..  a
e4b0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
e4c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
e4d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e4e0: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
e4f0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
e500: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
e510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e520: 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29  rse==p->pParse )
e530: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
e540: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
e550: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
e560: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
e570: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
e580: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
e590: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
e5a0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
e5b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
e5c0: 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20  g;.  .  /* Each 
e5d0: 63 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65  cursor uses a me
e5e0: 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20  mory cell.  The 
e5f0: 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 63 75  first cursor (cu
e600: 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a  rsor 0) can.  **
e610: 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69   use aMem[0] whi
e620: 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77  ch is not otherw
e630: 69 73 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ise used by the 
e640: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41  VDBE program.  A
e650: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61  llocate.  ** spa
e660: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
e670: 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73   aMem[] for curs
e680: 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61 74 65  ors 1 and greate
e690: 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  r..  ** See also
e6a0: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
e6b0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
e6c0: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66  += nCursor;.  if
e6d0: 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20  ( nCursor==0 && 
e6e0: 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b  nMem>0 ) nMem++;
e6f0: 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61    /* Space for a
e700: 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e  Mem[0] even if n
e710: 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a  ot used */..  /*
e720: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
e730: 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65  much reusable me
e740: 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  mory is availabl
e750: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
e760: 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20  the.  ** opcode 
e770: 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 78 74  array.  This ext
e780: 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ra memory will b
e790: 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f  e reallocated fo
e7a0: 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73  r other elements
e7b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65  .  ** of the pre
e7c0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
e7d0: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e  .  */.  n = ROUN
e7e0: 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d  D8(sizeof(Op)*p-
e7f0: 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20  >nOp);          
e800: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e810: 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73  opcode memory us
e820: 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65  ed */.  x.pSpace
e830: 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70   = &((u8*)p->aOp
e840: 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20  )[n];           
e850: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70      /* Unused op
e860: 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  code memory */. 
e870: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
e880: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e  YTE_ALIGNMENT(x.
e890: 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e  pSpace) );.  x.n
e8a0: 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e  Free = ROUNDDOWN
e8b0: 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c  8(pParse->szOpAl
e8c0: 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79  loc - n);  /* By
e8d0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65  tes of unused me
e8e0: 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74  mory */.  assert
e8f0: 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a  ( x.nFree>=0 );.
e900: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
e910: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26  BYTE_ALIGNMENT(&
e920: 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65  x.pSpace[x.nFree
e930: 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  ]) );..  resolve
e940: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
e950: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
e960: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
e970: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
e980: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
e990: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
e9a0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
e9b0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
e9c0: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
e9d0: 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  }.  p->expired =
e9e0: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79   0;..  /* Memory
e9f0: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20   for registers, 
ea00: 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73  parameters, curs
ea10: 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f  or, etc, is allo
ea20: 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20  cated in one or 
ea30: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
ea40: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
ea50: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
ea60: 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f  euse unused memo
ea70: 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20  ry at the .  ** 
ea80: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
ea90: 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20  e array.  If we 
eaa0: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61  are unable to sa
eab0: 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79  tisfy all memory
eac0: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e  .  ** requiremen
ead0: 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68  ts by reusing th
eae0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74  e opcode array t
eaf0: 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65  ail, then the se
eb00: 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77  cond.  ** pass w
eb10: 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ill fill in the 
eb20: 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20  remainder using 
eb30: 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61  a fresh memory a
eb40: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
eb50: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
eb60: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
eb70: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
eb80: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
eb90: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
eba0: 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f  he leftover memo
ebb0: 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ry at the end of
ebc0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
ebd0: 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67  y.  This can sig
ebe0: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
ebf0: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
ec00: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
ec10: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
ec20: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
ec30: 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65   do {.    x.nNee
ec40: 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ded = 0;.    p->
ec50: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
ec60: 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e  e(&x, p->aMem, n
ec70: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Mem*sizeof(Mem))
ec80: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
ec90: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
eca0: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
ecb0: 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70  eof(Mem));.    p
ecc0: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
ecd0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72  pace(&x, p->apAr
ece0: 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
ecf0: 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70  em*));.    p->ap
ed00: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
ed10: 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e  (&x, p->apCsr, n
ed20: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
ed30: 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66  beCursor*));.#if
ed40: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ed50: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
ed60: 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20  S.    p->anExec 
ed70: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
ed80: 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e   p->anExec, p->n
ed90: 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
eda0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
edb0: 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20 62  x.nNeeded==0 ) b
edc0: 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61  reak;.    x.pSpa
edd0: 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20  ce = p->pFree = 
ede0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
edf0: 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64  awNN(db, x.nNeed
ee00: 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65  ed);.    x.nFree
ee10: 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20   = x.nNeeded;.  
ee20: 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c  }while( !db->mal
ee30: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
ee40: 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72  p->pVList = pPar
ee50: 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50  se->pVList;.  pP
ee60: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20  arse->pVList =  
ee70: 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
ee80: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
ee90: 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  n;.  if( db->mal
eea0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
eeb0: 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20   p->nVar = 0;.  
eec0: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30    p->nCursor = 0
eed0: 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
eee0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
eef0: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
ef00: 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61  rsor;.    p->nVa
ef10: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
ef20: 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
ef30: 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c  y(p->aVar, nVar,
ef40: 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   db, MEM_Null);.
ef50: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
ef60: 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  em;.    initMemA
ef70: 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  rray(p->aMem, nM
ef80: 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65  em, db, MEM_Unde
ef90: 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73  fined);.    mems
efa0: 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20  et(p->apCsr, 0, 
efb0: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
efc0: 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
efd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
efe0: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
eff0: 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  US.    memset(p-
f000: 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e  >anExec, 0, p->n
f010: 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
f020: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
f030: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
f040: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
f050: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
f060: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
f070: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
f080: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
f090: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
f0a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
f0b0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
f0c0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
f0d0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
f0e0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
f0f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
f100: 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20  t( pCx->pBtx==0 
f110: 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  || pCx->eCurType
f120: 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
f130: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43 78  );.  switch( pCx
f140: 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20  ->eCurType ){.  
f150: 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 53    case CURTYPE_S
f160: 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ORTER: {.      s
f170: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
f180: 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
f190: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f1a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43      }.    case C
f1b0: 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a  URTYPE_BTREE: {.
f1c0: 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70        if( pCx->p
f1d0: 42 74 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Btx ){.        s
f1e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
f1f0: 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20  (pCx->pBtx);.   
f200: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d       /* The pCx-
f210: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
f220: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
f230: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
f240: 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ts, by.        *
f250: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
f260: 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  . */.      }else
f270: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f280: 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  ( pCx->uc.pCurso
f290: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
f2a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
f2b0: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e  eCursor(pCx->uc.
f2c0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
f2d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f2e0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f2f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f300: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43  TABLE.    case C
f310: 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20  URTYPE_VTAB: {. 
f320: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
f330: 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20  b_cursor *pVCur 
f340: 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b  = pCx->uc.pVCur;
f350: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  .      const sql
f360: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
f370: 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56  dule = pVCur->pV
f380: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
f390: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75      assert( pVCu
f3a0: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30  r->pVtab->nRef>0
f3b0: 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d   );.      pVCur-
f3c0: 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a  >pVtab->nRef--;.
f3d0: 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78        pModule->x
f3e0: 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20  Close(pVCur);.  
f3f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f400: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
f410: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
f420: 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75  ursors in the cu
f430: 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a  rrent frame..*/.
f440: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
f450: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
f460: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
f470: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
f480: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
f490: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
f4a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
f4b0: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
f4c0: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
f4d0: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
f4e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f4f0: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
f500: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
f510: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
f520: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
f530: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
f540: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
f550: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
f560: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
f570: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
f580: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
f590: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
f5a0: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
f5b0: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
f5c0: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
f5d0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
f5e0: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
f5f0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
f600: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
f610: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
f620: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63  = pFrame->v;.  c
f630: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
f640: 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51  me(v);.#ifdef SQ
f650: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
f660: 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d  _SCANSTATUS.  v-
f670: 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65  >anExec = pFrame
f680: 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66  ->anExec;.#endif
f690: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
f6a0: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
f6b0: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
f6c0: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
f6d0: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
f6e0: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
f6f0: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
f700: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
f710: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
f720: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
f730: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
f740: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
f750: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
f760: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
f770: 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62  nChange;.  v->db
f780: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
f790: 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20  me->nDbChange;. 
f7a0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
f7b0: 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c  teAuxData(v->db,
f7c0: 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &v->pAuxData, -
f7d0: 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78  1, 0);.  v->pAux
f7e0: 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70  Data = pFrame->p
f7f0: 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d  AuxData;.  pFram
f800: 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b  e->pAuxData = 0;
f810: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
f820: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
f830: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
f840: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
f850: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
f860: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
f870: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
f880: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
f890: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
f8a0: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
f8b0: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
f8c0: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
f8d0: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
f8e0: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
f8f0: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
f900: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
f910: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
f920: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
f930: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
f940: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
f950: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
f960: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
f970: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
f980: 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
f990: 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
f9a0: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
f9b0: 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
f9c0: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
f9d0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
f9e0: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70  e(pFrame);.    p
f9f0: 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->pFrame = 0;.  
fa00: 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
fa10: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
fa20: 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20  ->nFrame==0 );. 
fa30: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
fa40: 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70  rame(p);.  if( p
fa50: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
fa60: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
fa70: 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  >aMem, p->nMem);
fa80: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
fa90: 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
faa0: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
fab0: 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
fac0: 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
fad0: 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
fae0: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
faf0: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
fb00: 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Del);.  }..  /* 
fb10: 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61  Delete any auxda
fb20: 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d  ta allocations m
fb30: 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f  ade by the VM */
fb40: 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61  .  if( p->pAuxDa
fb50: 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ta ) sqlite3Vdbe
fb60: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d  DeleteAuxData(p-
fb70: 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
fb80: 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73  a, -1, 0);.  ass
fb90: 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61  ert( p->pAuxData
fba0: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
fbb0: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
fbc0: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72  after a single r
fbd0: 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  un..*/.static vo
fbe0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
fbf0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
fc00: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
fc10: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
fc20: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
fc30: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
fc40: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
fc50: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
fc60: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
fc70: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
fc80: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
fc90: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
fca0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
fcb0: 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69  p->apCsr ) for(i
fcc0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
fcd0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
fce0: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
fcf0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
fd00: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
fd10: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  <p->nMem; i++) a
fd20: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
fd30: 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64  ].flags==MEM_Und
fd40: 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  efined );.  }.#e
fd50: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44  ndif..  sqlite3D
fd60: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
fd70: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
fd80: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
fd90: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
fda0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
fdb0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
fdc0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
fdd0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
fde0: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
fdf0: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
fe00: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
fe10: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
fe20: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
fe30: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
fe40: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
fe50: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
fe60: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
fe70: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
fe80: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
fe90: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
fea0: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
feb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
fec0: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
fed0: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
fee0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
fef0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
ff00: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
ff10: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
ff20: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
ff30: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
ff40: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
ff50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ff60: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
ff70: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
ff80: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
ff90: 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
ffa0: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
ffb0: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
ffc0: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
ffd0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
ffe0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  N(db, sizeof(Mem
fff0: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
10000 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
10010 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41  turn;.  initMemA
10020 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
10030 2c 20 6e 2c 20 70 2d 3e 64 62 2c 20 4d 45 4d 5f  , n, p->db, MEM_
10040 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Null);.}../*.** 
10050 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
10060 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
10070 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
10080 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
10090 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
100a0 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
100b0 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
100c0 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
100d0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
100e0 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
100f0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
10100 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
10110 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
10120 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
10130 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
10140 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
10150 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
10160 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
10170 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
10180 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
10190 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
101a0 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
101b0 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
101c0 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
101d0 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
101e0 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
101f0 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
10200 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
10210 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
10240 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
10250 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10280 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
10290 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
102a0 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
102d0 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
102e0 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
102f0 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
10300 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
10310 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
10320 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
10330 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
10340 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
10350 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
10360 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
10370 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
10380 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
10390 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
103a0 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
103b0 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
103c0 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
103d0 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
103e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
103f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10400 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
10410 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
10420 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10430 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
10440 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
10450 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
10460 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
10470 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76  ->aColName[idx+v
10480 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  ar*p->nResColumn
10490 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
104a0 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
104b0 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
104c0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
104d0 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72  , xDel);.  asser
104e0 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61  t( rc!=0 || !zNa
104f0 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d  me || (pColName-
10500 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29  >flags&MEM_Term)
10510 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
10520 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
10530 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
10540 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
10550 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
10560 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
10570 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
10580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10590 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
105a0 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
105b0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
105c0 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
105d0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
105e0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
105f0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
10600 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
10610 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
10620 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
10630 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
10640 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
10650 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
10660 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30    int nTrans = 0
10670 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
10680 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61  databases with a
10690 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74  n active write-t
106a0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
106c0 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69 64   that are candid
106d0 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70  ates for a two-p
106e0 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e  hase commit usin
106f0 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  g a.            
10700 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72         ** master
10710 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  -journal */.  in
10720 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10730 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
10740 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
10750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10760 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
10770 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
10780 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
10790 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
107a0 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
107b0 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
107c0 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
107d0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
107e0 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
107f0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
10800 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
10810 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
10820 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
10830 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
10840 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
10850 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
10860 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
10870 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
10880 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
10890 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
108a0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
108b0 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
108c0 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
108d0 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
108e0 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
108f0 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
10900 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
10910 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
10920 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
10930 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a  nc(db, p);..  /*
10940 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
10950 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
10960 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
10970 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
10980 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
10990 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
109a0 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
109b0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
109c0 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
109d0 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
109e0 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
109f0 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
10a00 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
10a10 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
10a20 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
10a30 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
10a40 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
10a50 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
10a60 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
10a70 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
10a80 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
10a90 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
10aa0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
10ab0 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
10ac0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10ad0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
10ae0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
10af0 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
10b00 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f      /* Whether o
10b10 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  r not a database
10b20 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61   might need a ma
10b30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70  ster journal dep
10b40 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20  ends upon.      
10b50 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d  ** its journal m
10b60 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72  ode (among other
10b70 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20   things).  This 
10b80 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65  matrix determine
10b90 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  s which.      **
10ba0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75   journal modes u
10bb0 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  se a master jour
10bc0 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f  nal and which do
10bd0 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74   not */.      st
10be0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d  atic const u8 aM
10bf0 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20  JNeeded[] = {.  
10c00 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20        /* DELETE 
10c10 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20    */  1,.       
10c20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f   /* PERSIST   */
10c30 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   1,.        /* O
10c40 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  FF       */ 0,. 
10c50 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41         /* TRUNCA
10c60 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20  TE  */ 1,.      
10c70 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a    /* MEMORY    *
10c80 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 0,.        /* 
10c90 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20  WAL       */ 0. 
10ca0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61       };.      Pa
10cb0 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f  ger *pPager;   /
10cc0 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74  * Pager associat
10cd0 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20  ed with pBt */. 
10ce0 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
10cf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
10d00 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
10d10 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  t);.      pPager
10d20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
10d30 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
10d40 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
10d50 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41  safety_level!=PA
10d60 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
10d70 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d  OFF.       && aM
10d80 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50  JNeeded[sqlite3P
10d90 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerGetJournalMo
10da0 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20  de(pPager)].    
10db0 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61 73    ){ .        as
10dc0 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20 20  sert( i!=1 );.  
10dd0 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a        nTrans++;.
10de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
10df0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
10e00 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
10e10 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
10e20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
10e30 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
10e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10e50 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10e60 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
10e70 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
10e80 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10e90 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
10ea0 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
10eb0 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
10ec0 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
10ed0 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
10ee0 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
10ef0 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
10f00 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
10f10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10f30 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
10f40 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  THOOK;.    }.  }
10f50 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
10f60 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
10f70 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
10f80 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
10f90 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
10fa0 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
10fb0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
10fc0 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
10fd0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
10fe0 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
10ff0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
11000 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
11010 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
11020 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
11030 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
11040 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
11050 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
11060 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
11070 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d  memory: or a tem
11080 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a  p file.  In .  *
11090 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  * that case we d
110a0 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  o not support at
110b0 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
110c0 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
110d0 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
110e0 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a   case then too..
110f0 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71    */.  if( 0==sq
11100 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
11110 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11120 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
11130 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72  .pBt)).   || nTr
11140 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20  ans<=1.  ){.    
11150 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
11160 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11170 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11180 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11190 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
111a0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
111b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
111c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
111d0 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
111e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
111f0 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
11200 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
11210 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
11220 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
11230 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
11240 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
11250 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11260 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
11270 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
11280 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
11290 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
112a0 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
112b0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
112c0 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
112d0 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
112e0 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
112f0 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
11300 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
11310 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
11320 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
11330 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
11340 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
11350 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
11360 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11370 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11380 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
11390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
113a0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
113b0 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  o(pBt, 0);.     
113c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
113d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
113e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
113f0 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
11400 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
11410 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
11420 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
11430 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
11440 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
11450 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
11460 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
11470 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
11480 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
11490 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
114a0 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c  mitted atomicall
114b0 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
114c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
114d0 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
114e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
114f0 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
11500 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
11510 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
11520 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
11530 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
11540 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
11550 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
11560 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
11570 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
11580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
11590 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
115a0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
115b0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
115c0 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
115d0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
115e0 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
115f0 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
11600 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11610 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
11620 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
11630 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
11640 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
11650 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
11660 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
11670 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
11680 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
11690 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
116a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
116b0 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  KPT;.    do {.  
116c0 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
116d0 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
116e0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
116f0 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
11700 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
11710 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
11720 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
11730 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
11740 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
11750 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
11760 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
11770 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
11780 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
11790 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
117a0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
117b0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
117c0 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
117d0 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
117e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
117f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
11800 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
11810 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
11820 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
11830 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
11840 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11850 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
11860 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
11870 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
118a0 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
118b0 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
118c0 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
118d0 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
118e0 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
118f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11900 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
11910 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
11920 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
11930 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
11940 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
11950 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
11960 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
11970 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
11980 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
11990 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
119a0 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
119b0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
119c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
119d0 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
119e0 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
119f0 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
11a00 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
11a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
11a20 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
11a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11a40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
11a50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
11a60 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
11a70 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
11a80 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
11a90 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
11aa0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11ab0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
11ac0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
11ad0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11ae0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
11af0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
11b00 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
11b10 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
11b20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11b30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11b40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
11b50 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
11b60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
11b70 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
11b80 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
11b90 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
11ba0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11bb0 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
11bc0 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
11bd0 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
11be0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
11bf0 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
11c00 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
11c10 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11c20 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
11c30 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
11c40 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
11c50 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
11c60 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
11c70 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
11c80 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
11c90 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
11ca0 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
11cb0 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
11cc0 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
11cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
11ce0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
11cf0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
11d00 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
11d10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
11d20 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
11d30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
11d40 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
11d50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11d60 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
11d70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
11d80 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
11d90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
11da0 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
11db0 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
11dc0 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
11dd0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
11de0 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
11df0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11e00 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
11e10 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
11e20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
11e30 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
11e40 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
11e50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11e60 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
11e70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11e80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11e90 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11ea0 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
11eb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11ec0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11ed0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
11ee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
11ef0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
11f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
11f10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
11f20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11f30 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
11f40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11f50 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
11f60 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
11f70 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
11f80 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
11f90 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
11fa0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d    */.    if( 0==
11fb0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
11fc0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
11fd0 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
11fe0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
11ff0 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
12000 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
12010 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
12020 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
12030 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20  RMAL)).    ){.  
12040 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12050 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
12060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12070 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
12080 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
12090 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
120a0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
120b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
120c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
120d0 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
120e0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
120f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
12100 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
12110 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
12120 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
12130 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
12140 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
12150 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
12160 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
12170 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
12180 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12190 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
121a0 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
121b0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
121c0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
121d0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
121e0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
121f0 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
12200 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
12210 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
12220 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12230 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
12240 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
12250 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
12260 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
12270 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12280 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
12290 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
122a0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
122b0 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
122c0 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
122d0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
122e0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
122f0 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
12300 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
12310 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
12320 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
12330 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
12340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
12350 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
12360 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
12370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12380 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12390 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
123a0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
123b0 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
123c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
123d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
123e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
123f0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
12400 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12410 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
12420 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12430 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
12440 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
12450 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
12460 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
12470 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
12480 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
12490 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
124a0 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
124b0 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
124c0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
124d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
124e0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
124f0 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
12500 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12510 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
12520 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
12530 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
12540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12550 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
12560 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
12570 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
12580 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
12590 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
125a0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
125b0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
125c0 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
125d0 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
125e0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
125f0 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
12600 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
12610 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
12620 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
12630 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
12640 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
12650 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
12660 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
12670 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
12680 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
12690 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
126a0 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
126b0 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
126c0 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
126d0 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
126e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
126f0 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
12700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
12710 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
12720 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
12730 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12740 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
12750 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
12760 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
12770 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
12780 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
12790 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
127a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
127b0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
127c0 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
127d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
127e0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
127f0 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
12800 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12810 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
12820 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
12830 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
12840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12850 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
12860 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
12870 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62  the sqlite3.nVdb
12880 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61  eActive count va
12890 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65  riable.** matche
128a0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
128b0 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69  vdbe's in the li
128c0 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65  st sqlite3.pVdbe
128d0 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72   that are.** cur
128e0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41  rently active. A
128f0 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
12900 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75  s if the two cou
12910 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
12920 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
12930 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68  internal self-ch
12940 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73  eck only - it is
12950 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61   not an essentia
12960 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  l processing.** 
12970 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  step..**.** This
12980 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
12990 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
129a0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
129b0 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
129c0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
129d0 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  nt(sqlite3 *db){
129e0 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e  .  Vdbe *p;.  in
129f0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
12a00 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69   nWrite = 0;.  i
12a10 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20  nt nRead = 0;.  
12a20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
12a30 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
12a40 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d   if( sqlite3_stm
12a50 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f  t_busy((sqlite3_
12a60 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20  stmt*)p) ){.    
12a70 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
12a80 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  f( p->readOnly==
12a90 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  0 ) nWrite++;.  
12aa0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
12ab0 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a  ader ) nRead++;.
12ac0 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
12ad0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
12ae0 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e  sert( cnt==db->n
12af0 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20  VdbeActive );.  
12b00 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
12b10 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
12b20 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61  ;.  assert( nRea
12b30 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  d==db->nVdbeRead
12b40 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
12b50 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
12b60 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
12b70 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
12b80 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
12b90 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
12ba0 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
12bb0 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
12bc0 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
12bd0 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
12be0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
12bf0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12c00 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
12c10 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
12c20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
12c30 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
12c40 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
12c50 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
12c60 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
12c70 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
12c80 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
12c90 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
12ca0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
12cb0 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
12cc0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12cd0 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
12ce0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
12cf0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
12d00 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
12d10 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
12d20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
12d30 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
12d40 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
12d50 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
12d60 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
12d70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12d80 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61  .  /* If p->iSta
12d90 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65  tement is greate
12da0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
12db0 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e  n this Vdbe open
12dc0 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65  ed a .  ** state
12dd0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12de0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
12df0 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65  closed here. The
12e00 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a   only exception.
12e10 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20    ** is that an 
12e20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76  IO error may hav
12e30 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73  e occurred, caus
12e40 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  ing an emergency
12e50 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20   rollback..  ** 
12e60 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62  In this case (db
12e70 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29  ->nStatement==0)
12e80 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
12e90 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20  othing to do..  
12ea0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74  */.  if( db->nSt
12eb0 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
12ec0 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
12ed0 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
12ee0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
12ef0 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
12f00 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
12f10 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12f20 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
12f30 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12f40 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
12f50 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
12f60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12f70 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
12f80 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
12f90 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
12fa0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
12fb0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
12fc0 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20   .      int rc2 
12fd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12fe0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
12ff0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
13000 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
13010 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
13020 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
13030 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
13040 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
13050 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
13060 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
13070 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
13080 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
13090 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
130a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
130b0 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
130c0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
130d0 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
130e0 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
130f0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
13100 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13120 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
13130 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13140 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
13150 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
13160 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
13170 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
13180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13190 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  .      if( eOp==
131a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
131b0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
131c0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
131d0 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
131e0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
131f0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
13200 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
13210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13220 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13230 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
13240 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
13250 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
13260 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
13270 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
13280 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
13290 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
132a0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  g rolled back, a
132b0 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20  lso restore the 
132c0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
132d0 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
132e0 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
132f0 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
13300 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
13310 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
13320 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
13330 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
13340 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
13350 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
13360 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  ){.      db->nDe
13370 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
13380 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
13390 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
133a0 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  dImmCons = p->nS
133b0 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20  tmtDefImmCons;. 
133c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
133d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
133e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
133f0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
13400 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
13410 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65   by the database
13420 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f   .** handle asso
13430 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
13440 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
13450 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
13460 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d  t to be .** comm
13470 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  itted. If there 
13480 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
13490 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
134a0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
134b0 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72  ** violations, r
134c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
134d0 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  OR. Otherwise, S
134e0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
134f0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
13500 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c  standing FK viol
13510 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20  ations and this 
13520 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
13530 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
13540 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  R, set the resul
13550 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53  t of the VM to S
13560 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13570 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61  _FOREIGNKEY.** a
13580 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f  nd write an erro
13590 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
135a0 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
135b0 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
135c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
135d0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
135e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
135f0 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
13600 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
13610 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
13620 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
13630 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66  red && (db->nDef
13640 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44  erredCons+db->nD
13650 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e  eferredImmCons)>
13660 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65  0) .   || (!defe
13670 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f  rred && p->nFkCo
13680 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29  nstraint>0) .  )
13690 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
136a0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
136b0 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
136c0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
136d0 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
136e0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
136f0 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20  p, "FOREIGN KEY 
13700 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
13710 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
13720 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13730 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13740 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
13750 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13760 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
13770 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
13780 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
13790 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
137a0 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
137b0 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
137c0 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
137d0 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
137e0 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
137f0 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
13800 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
13810 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
13820 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
13830 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
13840 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
13850 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
13860 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
13870 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
13880 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
13890 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
138a0 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
138b0 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
138c0 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
138d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
138e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
138f0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
13900 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
13910 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
13920 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
13930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
13940 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
13950 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
13960 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
13970 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
13980 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
13990 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
139a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
139b0 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
139c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f    /* Used to sto
139f0 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74  re transient ret
13a00 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73  urn codes */.  s
13a10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
13a20 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  db;..  /* This f
13a30 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
13a40 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
13a50 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
13a60 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
13a70 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
13a80 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
13a90 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
13aa0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
13ab0 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
13ac0 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
13ad0 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
13ae0 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
13af0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
13b00 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
13b10 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
13b20 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
13b30 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
13b40 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
13b50 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
13b60 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
13b70 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
13b80 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
13b90 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
13ba0 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
13bb0 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
13bc0 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
13bd0 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
13be0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
13bf0 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
13c00 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
13c10 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
13c20 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
13c30 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
13c40 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
13c50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13c60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
13c70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13c80 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c  M_BKPT;.  }.  cl
13c90 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
13ca0 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
13cb0 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
13cc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13ce0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
13cf0 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
13d00 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
13d10 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
13d20 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
13d30 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
13d40 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
13d50 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
13d60 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
13d70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
13d80 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
13d90 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
13da0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
13db0 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
13dc0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
13dd0 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
13de0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
13df0 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
13e00 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
13e10 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
13e20 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
13e30 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
13e40 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
13e50 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
13e60 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
13e70 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
13e80 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
13e90 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
13ea0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
13eb0 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
13ec0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
13ed0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
13ee0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
13ef0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
13f00 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
13f10 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
13f20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
13f30 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
13f40 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
13f50 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
13f60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
13f70 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
13f80 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
13f90 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
13fa0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
13fb0 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
13fc0 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
13fd0 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
13fe0 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
13ff0 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
14000 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
14010 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
14020 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
14030 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
14040 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
14050 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
14060 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
14070 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
14080 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
14090 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
140a0 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
140b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
140c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
140d0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
140e0 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
140f0 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
14100 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
14110 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
14120 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
14130 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
14140 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
14150 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
14160 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
14170 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
14180 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
14190 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
141a0 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
141b0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
141c0 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
141d0 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
141e0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
141f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14200 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
14210 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
14220 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
14230 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
14240 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
14250 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
14260 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
14270 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
14280 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
14290 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
142a0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
142b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
142c0 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
142d0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
142e0 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
142f0 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
14300 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
14310 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
14320 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
14330 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
14340 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
14350 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
14360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14370 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14380 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
14390 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
143a0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
143b0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
143c0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
143d0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
143e0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
143f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
14400 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
14410 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69    /* Check for i
14420 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
14430 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e   key violations.
14440 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
14450 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14470 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a  eCheckFk(p, 0);.
14480 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
14490 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
144a0 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
144b0 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
144c0 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65  nly active write
144d0 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68  r .    ** VM, th
144e0 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  en we do either 
144f0 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
14500 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
14510 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
14520 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
14530 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
14540 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
14550 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
14560 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
14570 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
14580 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
14590 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
145a0 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
145b0 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
145c0 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
145d0 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69   && db->nVdbeWri
145e0 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  te==(p->readOnly
145f0 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ==0) .    ){.   
14600 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
14610 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
14620 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
14630 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
14640 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
14650 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
14660 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
14670 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14690 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
146a0 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ER(p->readOnly) 
146b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
146c0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
146d0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
146e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
146f0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
14700 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
14710 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
14720 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
14730 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20        }else{ .  
14740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
14750 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
14760 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62  is true, the vdb
14770 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75  e program was su
14780 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20  ccessful .      
14790 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e      ** or hit an
147a0 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74   'OR FAIL' const
147b0 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20  raint and there 
147c0 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20  are no deferred 
147d0 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20  foreign.        
147e0 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61    ** key constra
147f0 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20  ints to hold up 
14800 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
14810 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
14820 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20  mmit .          
14830 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
14840 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
14850 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c  = vdbeCommit(db,
14860 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
14870 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14880 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d  QLITE_BUSY && p-
14890 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
148a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
148b0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
148c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
148d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
148e0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
148f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14900 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
14910 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
14920 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
14930 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
14940 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
14950 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
14960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14970 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
14980 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
14990 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
149a0 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
149b0 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
149c0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
149d0 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
149e0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
149f0 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
14a00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14a10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14a20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
14a30 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
14a40 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OK);.        p->
14a50 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14a60 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
14a70 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
14a80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
14a90 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
14aa0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
14ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
14ac0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
14ad0 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
14ae0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
14af0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14b00 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
14b10 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
14b20 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
14b30 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
14b40 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
14b50 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
14b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
14b70 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
14b80 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
14b90 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
14ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
14bb0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
14bc0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
14bd0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
14be0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14bf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14c00 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
14c10 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
14c20 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
14c30 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
14c40 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
14c50 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
14c60 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
14c70 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
14c80 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
14c90 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
14ca0 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
14cb0 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
14cc0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
14cd0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
14ce0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
14cf0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
14d00 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
14d10 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
14d20 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
14d30 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
14d40 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
14d50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
14d60 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
14d70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14d80 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
14d90 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
14da0 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
14db0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
14dc0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14dd0 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
14de0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
14df0 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
14e00 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
14e10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14e20 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
14e30 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
14e40 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
14e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14e60 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
14e70 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
14e80 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
14e90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14ea0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
14eb0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
14ec0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
14ed0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
14ee0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14ef0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
14f00 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
14f10 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
14f20 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
14f30 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
14f40 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
14f50 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
14f60 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
14f70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14f80 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
14f90 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
14fa0 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
14fb0 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
14fc0 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
14fd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14ff0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
15000 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
15010 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15030 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
15040 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15050 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
15060 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
15070 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
15080 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
15090 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
150a0 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
150b0 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
150c0 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
150d0 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
150e0 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
150f0 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
15100 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63  .    db->nVdbeAc
15110 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tive--;.    if( 
15120 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64  !p->readOnly ) d
15130 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b  b->nVdbeWrite--;
15140 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52  .    if( p->bIsR
15150 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62  eader ) db->nVdb
15160 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73  eRead--;.    ass
15170 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
15180 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52  tive>=db->nVdbeR
15190 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ead );.    asser
151a0 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  t( db->nVdbeRead
151b0 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  >=db->nVdbeWrite
151c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
151d0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d  db->nVdbeWrite>=
151e0 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  0 );.  }.  p->ma
151f0 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
15200 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
15210 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
15220 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
15230 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
15240 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
15250 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
15260 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
15270 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
15280 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
15290 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
152a0 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
152b0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
152c0 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
152d0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
152e0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
152f0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
15300 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
15310 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
15320 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
15330 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
15340 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
15350 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
15360 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
15370 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
15380 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
15390 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
153a0 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
153b0 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
153c0 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
153d0 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
153e0 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
153f0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
15400 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
15410 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
15420 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
15430 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
15440 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
15450 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
15460 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
15470 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
15480 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15490 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
154a0 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
154b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
154c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
154d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
154e0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
154f0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
15500 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
15510 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
15520 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
15530 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
15540 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
15550 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
15560 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
15570 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
15580 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
15590 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
155a0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
155b0 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
155c0 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
155d0 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
155e0 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
155f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
15600 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
15610 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
15620 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
15630 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15640 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
15650 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
15660 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
15670 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c   db->bBenignMall
15680 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc++;.    sqlite
15690 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
156a0 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62  oc();.    if( db
156b0 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e  ->pErr==0 ) db->
156c0 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61  pErr = sqlite3Va
156d0 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
156e0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
156f0 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
15700 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
15710 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
15720 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
15730 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
15740 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64  nMalloc();.    d
15750 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  b->bBenignMalloc
15760 2d 2d 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  --;.    db->errC
15770 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
15780 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
15790 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d  ror(db, rc);.  }
157a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
157b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
157c0 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
157d0 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
157e0 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
157f0 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
15800 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
15810 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
15820 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
15830 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
15840 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
15850 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
15860 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
15870 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
15880 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
15890 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
158a0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
158b0 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
158c0 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
158d0 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
158e0 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
158f0 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
15900 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
15910 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15920 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
15930 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
15940 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
15950 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
15960 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
15970 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
15980 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15990 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
159a0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
159b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
159c0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
159d0 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
159e0 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
159f0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
15a00 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
15a10 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
15a20 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
15a30 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
15a40 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
15a50 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
15a60 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
15a70 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
15a80 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
15a90 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
15aa0 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
15ab0 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
15ac0 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
15ad0 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
15ae0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
15af0 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
15b00 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
15b10 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
15b20 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
15b30 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
15b40 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
15b50 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
15b60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
15b70 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
15b80 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
15b90 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
15ba0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
15bb0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
15bc0 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
15bd0 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
15be0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
15bf0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
15c00 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
15c10 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
15c20 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
15c30 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
15c40 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
15c50 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
15c60 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
15c70 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
15c80 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
15c90 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
15ca0 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
15cb0 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
15cc0 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
15cd0 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
15ce0 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
15cf0 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
15d00 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
15d10 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
15d20 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
15d30 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
15d40 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
15d50 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
15d60 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
15d70 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
15d80 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
15d90 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
15da0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15db0 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
15dc0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
15dd0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
15de0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
15df0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
15e00 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
15e10 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
15e20 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
15e30 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
15e40 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
15e50 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
15e60 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
15e70 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
15e80 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
15e90 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
15ea0 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
15eb0 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
15ec0 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
15ed0 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
15ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
15ef0 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
15f00 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
15f10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15f20 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e  rWithMsg(db, p->
15f30 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f  rc, p->zErrMsg ?
15f40 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45   "%s" : 0, p->zE
15f50 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
15f60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
15f70 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
15f80 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
15f90 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
15fa0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
15fb0 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
15fc0 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
15fd0 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
15fe0 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
15ff0 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
16000 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
16010 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
16020 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
16030 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
16040 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
16050 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
16060 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
16070 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16080 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
16090 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
160a0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
160b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
160c0 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
160d0 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
160e0 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
160f0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
16100 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
16110 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
16120 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
16130 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
16140 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
16150 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
16160 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
16170 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16180 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
16190 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
161a0 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
161b0 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
161c0 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
161d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
161e0 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
161f0 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
16200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
16210 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
16220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
16230 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
16240 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
16250 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
16260 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
16270 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
16280 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
16290 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
162a0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
162b0 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
162c0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
162d0 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
162e0 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
162f0 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
16300 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
16310 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
16320 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
16330 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
16340 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
16350 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
16360 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
16370 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
16380 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d    p->iCurrentTim
16390 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = 0;.  p->magi
163a0 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
163b0 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  ESET;.  return p
163c0 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
163d0 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
163e0 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
163f0 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
16400 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
16410 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
16420 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
16430 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
16440 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
16450 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
16460 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
16470 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
16480 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
16490 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
164a0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
164b0 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
164c0 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
164d0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
164e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
164f0 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
16500 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
16510 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
16520 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73  )==rc );.  }.  s
16530 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
16540 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61  ;.}../*.** If pa
16560 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c  rameter iOp is l
16570 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
16580 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  hen invoke the d
16590 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a  estructor for.**
165a0 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64   all auxiliary d
165b0 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72  ata pointers cur
165c0 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79  rently cached by
165d0 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
165e0 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  s.** the first a
165f0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  rgument..**.** O
16600 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65  r, if iOp is gre
16610 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
16620 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  al to zero, then
16630 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
16640 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b  is.** only invok
16650 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78  ed for those aux
16660 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
16670 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20  ters created by 
16680 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e  the user .** fun
16690 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79  ction invoked by
166a0 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e   the OP_Function
166b0 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72   opcode at instr
166c0 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a  uction iOp of .*
166d0 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20  * VM pVdbe, and 
166e0 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a  only then if:.**
166f0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73  .**    * the ass
16700 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  ociated function
16710 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
16720 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20  e 32nd or later 
16730 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20  (counting.**    
16740 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72    from left to r
16750 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20  ight), or.**.** 
16760 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70     * the corresp
16770 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72  onding bit in ar
16780 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63  gument mask is c
16790 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20  lear (where the 
167a0 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75  first.**      fu
167b0 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
167c0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
167d0 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a  bit 0 etc.)..*/.
167e0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
167f0 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73 71  DeleteAuxData(sq
16800 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61  lite3 *db, AuxDa
16810 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70  ta **pp, int iOp
16820 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77  , int mask){.  w
16830 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20  hile( *pp ){.   
16840 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
16850 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69   *pp;.    if( (i
16860 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70  Op<0).     || (p
16870 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26  Aux->iOp==iOp &&
16880 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20   (pAux->iArg>31 
16890 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b  || !(mask & MASK
168a0 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67  BIT32(pAux->iArg
168b0 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
168c0 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78    testcase( pAux
168d0 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20  ->iArg==31 );.  
168e0 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
168f0 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
16900 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
16910 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
16920 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
16930 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
16940 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16950 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20  (db, pAux);.    
16960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d  }else{.      pp=
16970 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20   &pAux->pNext;. 
16980 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16990 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
169a0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
169b0 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
169c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
169d0 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63  argument,.** exc
169e0 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69  ept for object i
169f0 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20  tself, which is 
16a00 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
16a10 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
16a20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
16a30 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
16a40 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
16a50 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
16a60 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
16a70 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
16a80 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
16a90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16aa0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
16ab0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
16ac0 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74  frees the object
16ad0 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64   itself..*/.void
16ae0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16af0 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  rObject(sqlite3 
16b00 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
16b10 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
16b20 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73  b, *pNext;.  ass
16b30 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
16b40 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
16b50 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
16b60 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
16b70 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
16b80 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
16b90 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
16ba0 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
16bb0 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
16bc0 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
16bd0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
16be0 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
16bf0 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
16c00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16c10 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pSub);.  }.  if(
16c20 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
16c30 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
16c40 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
16c50 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
16c60 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ar);.    sqlite3
16c70 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56  DbFree(db, p->pV
16c80 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
16c90 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16ca0 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64  pFree);.  }.  vd
16cb0 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
16cc0 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
16cd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16ce0 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
16cf0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
16d00 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
16d10 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16d20 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
16d30 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20  NSTATUS.  {.    
16d40 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
16d50 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
16d60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
16d70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16d80 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  >aScan[i].zName)
16d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16da0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16db0 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e  >aScan);.  }.#en
16dc0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  dif.}../*.** Del
16dd0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
16de0 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
16df0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
16e00 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
16e10 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45  3 *db;..  if( NE
16e20 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
16e30 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
16e40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16e50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
16e60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16e70 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
16e80 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20  bject(db, p);.  
16e90 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
16ea0 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
16eb0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
16ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
16ed0 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d  ert( db->pVdbe==
16ee0 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64  p );.    db->pVd
16ef0 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
16f00 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
16f10 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
16f20 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
16f30 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  rev;.  }.  p->ma
16f40 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
16f50 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d  _DEAD;.  p->db =
16f60 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
16f70 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
16f80 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
16f90 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e  "p" has a pendin
16fa0 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  g seek operation
16fb0 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
16fc0 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65  t been.** carrie
16fd0 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65  d out.  Seek the
16fe0 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66   cursor now.  If
16ff0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
17000 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
17010 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
17020 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
17030 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
17040 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65  NLINE handleDefe
17050 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43  rredMoveto(VdbeC
17060 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
17070 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
17080 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
17090 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
170a0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
170b0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
170c0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
170d0 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  to );.  assert( 
170e0 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
170f0 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
17100 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
17110 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  EE );.  rc = sql
17120 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
17130 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43  npacked(p->uc.pC
17140 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
17150 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
17160 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
17170 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
17180 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
17190 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
171a0 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
171b0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
171c0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
171d0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
171e0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
171f0 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
17200 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
17210 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
17220 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17230 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
17240 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
17250 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
17260 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
17270 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
17280 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
17290 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
172a0 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
172b0 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
172c0 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
172d0 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
172e0 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
172f0 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
17300 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
17310 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
17320 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
17330 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
17340 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
17350 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
17360 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
17370 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
17380 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
17390 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
173a0 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
173b0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
173c0 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
173d0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
173e0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
173f0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
17400 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75  ssert( p->uc.pCu
17410 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
17420 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
17430 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
17440 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
17450 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17460 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
17470 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  re(p->uc.pCursor
17480 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
17490 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
174a0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
174b0 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
174c0 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
174d0 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
174e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
174f0 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
17500 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
17510 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
17520 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
17530 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
17540 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
17550 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
17560 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
17570 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17580 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
17590 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
175a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
175b0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
175c0 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71  TREE );.  if( sq
175d0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
175e0 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
175f0 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
17600 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
17610 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
17620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17630 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
17640 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
17650 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
17660 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
17670 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
17680 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
17690 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
176a0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
176b0 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
176c0 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
176d0 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
176e0 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
176f0 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
17700 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
17710 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
17720 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
17730 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
17740 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
17750 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
17760 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
17770 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
17780 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
17790 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
177a0 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
177b0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
177c0 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
177d0 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
177e0 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
177f0 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
17800 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
17810 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
17820 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
17830 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
17840 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
17850 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
17860 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
17870 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
17880 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
17890 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
178a0 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
178b0 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e  eCursor **pp, in
178c0 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62  t *piCol){.  Vdb
178d0 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70  eCursor *p = *pp
178e0 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54  ;.  if( p->eCurT
178f0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
17900 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  EE ){.    if( p-
17910 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
17920 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61  ){.      int iMa
17930 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  p;.      if( p->
17940 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70  aAltMap && (iMap
17950 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b   = p->aAltMap[1+
17960 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20  *piCol])>0 ){.  
17970 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
17980 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  AltCursor;.     
17990 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70     *piCol = iMap
179a0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   - 1;.        re
179b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
179c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
179d0 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72  turn handleDefer
179e0 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20  redMoveto(p);.  
179f0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
17a00 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
17a10 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
17a20 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 72  rsor) ){.      r
17a30 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
17a40 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  dCursor(p);.    
17a50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
17a60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17a70 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
17a80 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
17a90 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
17aa0 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
17ab0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17ac0 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
17ad0 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
17ae0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17af0 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
17b00 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17b10 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
17b20 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
17b30 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
17b40 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
17b50 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
17b60 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
17b70 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
17b80 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
17b90 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
17ba0 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
17bb0 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
17bc0 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
17bd0 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
17be0 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
17bf0 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
17c00 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
17c10 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
17c20 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
17c30 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
17c40 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
17c50 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
17c60 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
17c70 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
17c80 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
17c90 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
17ca0 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
17cb0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
17cc0 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
17cd0 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
17ce0 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
17cf0 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
17d00 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
17d10 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
17d20 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
17d30 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
17d40 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  lob separately..
17d50 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
17d60 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
17d70 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
17d80 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
17d90 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
17da0 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
17db0 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
17dc0 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
17dd0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17de0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
17df0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
17e00 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
17e10 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
17e20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
17e30 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
17e40 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
17e50 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
17e60 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17e70 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
17ea0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17eb0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
17ec0 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
17ed0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17ee0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
17f10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17f20 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
17f40 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17f50 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17f60 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
17f70 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
17f80 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17f90 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
17fc0 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
17fd0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
17fe0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
17ff0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
18000 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
18010 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
18020 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
18030 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
18040 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
18050 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
18080 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
18090 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
180a0 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
180b0 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
180c0 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
180d0 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
180e0 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
180f0 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
18100 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
18110 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
18120 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
18130 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
18140 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
18150 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
18160 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
18170 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
18180 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
18190 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
181a0 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
181b0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
181c0 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
181d0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  int file_format,
181e0 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69   u32 *pLen){.  i
181f0 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
18200 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b  >flags;.  u32 n;
18210 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e  ..  assert( pLen
18220 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61  !=0 );.  if( fla
18230 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
18240 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20     *pLen = 0;.  
18250 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18260 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
18270 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Int ){.    /* Fi
18280 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
18290 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c   to use 1, 2, 4,
182a0 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   6 or 8 bytes. *
182b0 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
182c0 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30  _6BYTE ((((i64)0
182d0 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d  x00008000)<<32)-
182e0 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70  1).    i64 i = p
182f0 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36  Mem->u.i;.    u6
18300 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30  4 u;.    if( i<0
18310 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69   ){.      u = ~i
18320 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18330 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a     u = i;.    }.
18340 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
18350 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 26 31  {.      if( (i&1
18360 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72  )==i && file_for
18370 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20  mat>=4 ){.      
18380 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20    *pLen = 0;.   
18390 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75       return 8+(u
183a0 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73  32)u;.      }els
183b0 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e  e{.        *pLen
183c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
183d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
183e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
183f0 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20  =32767 ){ *pLen 
18400 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d  = 2; return 2; }
18410 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
18420 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33  607 ){ *pLen = 3
18430 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20  ; return 3; }.  
18440 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
18450 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34  647 ){ *pLen = 4
18460 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20  ; return 4; }.  
18470 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
18480 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b  TE ){ *pLen = 6;
18490 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20   return 5; }.   
184a0 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20   *pLen = 8;.    
184b0 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
184c0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
184d0 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20  al ){.    *pLen 
184e0 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 8;.    return 
184f0 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
18500 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
18510 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
18520 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
18530 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ob) );.  assert(
18540 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20   pMem->n>=0 );. 
18550 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e   n = (u32)pMem->
18560 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
18570 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
18580 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a   n += pMem->u.nZ
18590 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e  ero;.  }.  *pLen
185a0 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28   = n;.  return (
185b0 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
185c0 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
185d0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ));.}../*.** The
185e0 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61   sizes for seria
185f0 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74 68 61  l types less tha
18600 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20  n 128.*/.static 
18610 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33  const u8 sqlite3
18620 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d  SmallTypeSizes[]
18630 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
18640 20 30 20 20 20 31 20 20 20 32 20 20 20 33 20 20   0   1   2   3  
18650 20 34 20 20 20 35 20 20 20 36 20 20 20 37 20 20   4   5   6   7  
18660 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20   8   9 */   ./* 
18670 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20    0 */   0,  1, 
18680 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20   2,  3,  4,  6, 
18690 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a   8,  8,  0,  0,.
186a0 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20  /*  10 */   0,  
186b0 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20  0,  0,  0,  1,  
186c0 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20  1,  2,  2,  3,  
186d0 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34  3,./*  20 */   4
186e0 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36  ,  4,  5,  5,  6
186f0 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38  ,  6,  7,  7,  8
18700 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20  ,  8,./*  30 */ 
18710 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c    9,  9, 10, 10,
18720 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c   11, 11, 12, 12,
18730 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20   13, 13,./*  40 
18740 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20  */  14, 14, 15, 
18750 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20  15, 16, 16, 17, 
18760 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20  17, 18, 18,./*  
18770 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32  50 */  19, 19, 2
18780 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32  0, 20, 21, 21, 2
18790 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f  2, 22, 23, 23,./
187a0 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34  *  60 */  24, 24
187b0 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36  , 25, 25, 26, 26
187c0 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38  , 27, 27, 28, 28
187d0 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c  ,./*  70 */  29,
187e0 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c   29, 30, 30, 31,
187f0 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c   31, 32, 32, 33,
18800 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20   33,./*  80 */  
18810 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20  34, 34, 35, 35, 
18820 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20  36, 36, 37, 37, 
18830 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a  38, 38,./*  90 *
18840 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34  /  39, 39, 40, 4
18850 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34  0, 41, 41, 42, 4
18860 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30  2, 43, 43,./* 10
18870 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35  0 */  44, 44, 45
18880 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37  , 45, 46, 46, 47
18890 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a  , 47, 48, 48,./*
188a0 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c   110 */  49, 49,
188b0 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c   50, 50, 51, 51,
188c0 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c   52, 52, 53, 53,
188d0 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20  ./* 120 */  54, 
188e0 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20  54, 55, 55, 56, 
188f0 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f  56, 57, 57.};../
18900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18910 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
18920 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
18930 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
18940 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
18950 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
18960 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
18970 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
18980 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
18990 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65  e>=128 ){.    re
189a0 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
189b0 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
189c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 65  {.    assert( se
189d0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20  rial_type<12 .  
189e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
189f0 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
18a00 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d  es[serial_type]=
18a10 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20  =(serial_type - 
18a20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74  12)/2 );.    ret
18a30 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
18a40 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
18a50 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38  _type];.  }.}.u8
18a60 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42   sqlite3VdbeOneB
18a70 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  yteSerialTypeLen
18a80 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29  (u8 serial_type)
18a90 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69  {.  assert( seri
18aa0 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20  al_type<128 );. 
18ab0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
18ac0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
18ad0 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a  rial_type];  .}.
18ae0 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
18af0 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
18b00 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
18b10 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
18b20 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
18b30 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
18b40 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
18b50 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
18b60 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
18b70 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
18b80 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
18b90 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
18ba0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
18bb0 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
18bc0 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
18bd0 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
18be0 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
18bf0 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
18c00 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
18c10 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
18c20 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
18c30 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
18c40 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
18c50 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
18c60 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
18c70 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
18c80 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
18c90 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
18ca0 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
18cb0 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
18cc0 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
18cd0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
18ce0 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
18cf0 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
18d00 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
18d10 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
18d20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
18d30 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
18d40 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
18d50 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
18d60 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
18d70 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
18d80 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
18d90 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
18da0 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
18db0 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
18dc0 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
18dd0 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
18de0 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
18df0 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
18e00 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
18e10 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
18e20 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
18e30 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
18e40 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
18e50 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
18e60 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
18e70 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
18e80 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
18e90 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
18ea0 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
18eb0 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
18ec0 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
18ed0 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
18ee0 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
18ef0 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
18f00 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
18f10 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
18f20 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
18f30 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
18f40 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
18f50 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
18f60 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
18f70 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
18f80 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
18f90 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
18fa0 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
18fb0 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
18fc0 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
18fd0 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
18fe0 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
18ff0 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
19000 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
19010 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
19020 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
19030 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
19040 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
19050 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
19060 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
19070 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
19080 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
19090 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
190a0 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
190b0 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
190c0 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
190d0 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
190e0 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
190f0 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
19100 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
19110 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
19120 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
19130 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
19140 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
19150 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
19160 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
19170 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
19180 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
19190 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
191a0 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
191b0 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
191c0 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
191d0 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
191e0 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
191f0 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
19200 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
19210 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
19220 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
19230 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
19240 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
19250 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
19260 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
19270 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
19280 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
19290 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
192a0 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
192b0 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
192c0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
192d0 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
192e0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
192f0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
19300 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
19310 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
19320 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
19330 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
19340 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
19350 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
19360 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
19370 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c   buf[].  The cal
19380 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
19390 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61  le.** for alloca
193a0 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63  ting enough spac
193b0 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f  e to buf[] to ho
193c0 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
193d0 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a  eld, exclusive.*
193e0 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75  * of the pMem->u
193f0 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72  .nZero bytes for
19400 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75   a MEM_Zero valu
19410 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
19420 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19430 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
19440 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
19450 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
19460 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
19470 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
19480 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
19490 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
194a0 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
194b0 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
194c0 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
194d0 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
194e0 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
194f0 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75  uf, Mem *pMem, u
19500 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
19510 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 75 36  .  u32 len;.  u6
19520 34 20 76 3b 0a 20 20 75 33 32 20 69 3b 0a 0a 20  4 v;.  u32 i;.. 
19530 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
19540 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
19550 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
19560 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
19570 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
19580 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
19590 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
195b0 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
195c0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
195d0 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
195e0 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
195f0 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29  .    if( len>0 )
19600 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
19610 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
19620 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
19630 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
19640 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
19650 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
19660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  {.    assert( si
19670 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
19680 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20  pMem->u.r) );.  
19690 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
196a0 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28  em->u.r, sizeof(
196b0 76 29 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  v));.    swapMix
196c0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
196d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
196e0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
196f0 7d 0a 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71  }.  len = i = sq
19700 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
19710 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
19720 3b 0a 20 20 76 20 3d 20 5f 5f 62 75 69 6c 74 69  ;.  v = __builti
19730 6e 5f 62 73 77 61 70 36 34 28 76 29 3b 0a 20 20  n_bswap64(v);.  
19740 6d 65 6d 63 70 79 28 62 75 66 2c 20 26 28 28 63  memcpy(buf, &((c
19750 68 61 72 2a 29 26 76 29 5b 38 2d 69 5d 2c 20 69  har*)&v)[8-i], i
19760 29 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  );.  return len;
19770 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
19780 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
19790 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
197a0 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
197b0 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
197c0 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
197d0 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
197e0 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
197f0 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
19800 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
19810 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
19820 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
19830 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
19840 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
19850 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
19860 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
19870 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
19880 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
19890 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
198a0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
198b0 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
198c0 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
198d0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
198e0 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
198f0 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
19900 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
19910 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
19920 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
19930 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
19940 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
19950 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
19960 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
19970 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
19980 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
19990 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
199a0 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
199b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
199c0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
199d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
199e0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
199f0 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
19a00 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
19a10 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
19a20 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
19a30 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
19a40 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
19a50 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
19a60 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
19a70 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
19a80 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
19a90 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
19aa0 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
19ab0 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
19ac0 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
19ad0 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
19ae0 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
19af0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
19b00 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
19b10 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
19b20 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
19b30 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
19b40 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
19b50 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
19b60 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
19b70 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19b80 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
19b90 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
19ba0 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
19bb0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
19bc0 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
19bd0 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
19be0 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
19bf0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
19c00 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
19c10 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
19c20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19c30 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
19c40 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19c50 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
19c60 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19c70 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19c80 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
19c90 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
19ca0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19cb0 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
19cc0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19ce0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19cf0 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
19d00 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19d10 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
19d20 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
19d30 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
19d40 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
19d50 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
19d60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19d70 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
19d80 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
19d90 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
19da0 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
19db0 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
19dc0 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
19dd0 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
19de0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
19df0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
19e00 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
19e10 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
19e20 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
19e30 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
19e40 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
19e50 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
19e60 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
19e70 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
19e80 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
19e90 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
19ea0 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
19eb0 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
19ec0 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
19ed0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
19ee0 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
19ef0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
19f00 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
19f10 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
19f20 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
19f30 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
19f40 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
19f50 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
19f60 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
19f70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19f80 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
19f90 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
19fa0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
19fb0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
19fc0 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
19fd0 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
19fe0 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
19ff0 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
1a000 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1a010 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
1a020 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a030 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
1a040 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
1a050 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
1a060 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
1a070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
1a080 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
1a090 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
1a0a0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
1a0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1a0c0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
1a0d0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
1a0e0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
1a0f0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1a100 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
1a110 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1a120 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
1a130 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
1a140 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
1a150 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
1a160 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
1a170 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a180 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
1a190 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
1a1a0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
1a1b0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1a1c0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
1a1d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1a1e0 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
1a1f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a200 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
1a210 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
1a220 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
1a230 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
1a240 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1a250 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
1a260 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a270 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a280 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a290 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a2a0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a2b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
1a2c0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
1a2d0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a2e0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a2f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
1a300 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
1a310 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
1a320 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a330 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a340 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a350 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
1a360 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1a370 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1a380 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1a390 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1a3a0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1a3b0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
1a3c0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1a3d0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1a3e0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1a3f0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a400 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
1a410 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1a420 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
1a430 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1a440 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1a450 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1a460 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
1a470 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a480 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a490 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a4a0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a4b0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a4c0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
1a4d0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
1a4e0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a4f0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a500 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
1a510 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
1a520 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
1a530 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a540 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a550 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a560 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1a570 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1a580 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a  #ifdef __HP_cc .
1a590 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72        /* Work ar
1a5a0 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65  ound a sign-exte
1a5b0 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65  nsion bug in the
1a5c0 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72   HP compiler for
1a5d0 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20   HP/UX */.      
1a5e0 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20  if( buf[0]&0x80 
1a5f0 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30  ) pMem->u.i |= 0
1a600 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30 30  xffffffff8000000
1a610 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0LL;.#endif.    
1a620 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a630 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a640 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a650 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a660 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
1a670 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
1a680 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a690 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a6a0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a6b0 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75  50385-09674 Valu
1a6c0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a6d0 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 48-bit.      *
1a6e0 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a6f0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a700 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a710 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1a720 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
1a730 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1a740 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a750 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a760 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a770 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a780 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a790 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
1a7a0 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
1a7b0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a7c0 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
1a7d0 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
1a7e0 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
1a7f0 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
1a800 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1a810 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
1a820 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
1a830 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
1a840 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
1a850 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
1a860 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
1a870 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
1a880 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
1a890 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
1a8a0 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
1a8b0 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
1a8c0 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
1a8d0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
1a8e0 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
1a8f0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a900 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39  OF: R-12976-2289
1a910 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  3 Value is the i
1a920 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20  nteger 0. */.   
1a930 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a940 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31  F: R-18143-12121
1a950 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
1a960 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20  teger 1. */.    
1a970 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
1a980 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
1a990 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a9a0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a9b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1a9c0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1a9d0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a9e0 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35  -OF: R-14606-315
1a9f0 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c  64 Value is a BL
1aa00 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32  OB that is (N-12
1aa10 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20  )/2 bytes in.   
1aa20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20     ** length..  
1aa30 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1aa40 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34  OF: R-28401-0014
1aa50 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72  0 Value is a str
1aa60 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20  ing in the text 
1aa70 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20  encoding and.   
1aa80 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62     ** (N-13)/2 b
1aa90 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
1aaa0 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
1aab0 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
1aac0 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
1aad0 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
1aae0 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
1aaf0 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
1ab00 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
1ab10 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
1ab20 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
1ab30 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1ab40 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
1ab50 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
1ab60 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
1ab70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ab80 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
1ab90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1aba0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
1abb0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1abc0 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
1abd0 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
1abe0 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
1abf0 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
1ac00 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1ac10 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
1ac20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1ac30 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1ac40 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
1ac50 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
1ac60 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
1ac70 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
1ac80 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
1ac90 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
1aca0 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
1acb0 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
1acc0 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
1acd0 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
1ace0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
1acf0 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
1ad00 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
1ad10 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
1ad20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1ad30 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
1ad40 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
1ad50 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
1ad60 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
1ad70 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1ad80 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
1ad90 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
1ada0 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
1adb0 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
1adc0 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
1add0 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
1ade0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1adf0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
1ae00 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
1ae10 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1ae20 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
1ae30 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
1ae40 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
1ae50 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
1ae60 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20  eyInfo          
1ae70 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1ae80 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
1ae90 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b  d */.){.  Unpack
1aea0 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20  edRecord *p;    
1aeb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70            /* Unp
1aec0 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20  acked record to 
1aed0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
1aee0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1af00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1af10 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a  equired for *p *
1af20 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  /.  nByte = ROUN
1af30 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1af40 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
1af50 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
1af60 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
1af70 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
1af80 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
1af90 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
1afa0 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
1afb0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1afc0 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  n 0;.  p->aMem =
1afd0 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1afe0 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1aff0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1b000 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1b010 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1b020 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1b030 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1b040 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1b050 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1b060 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1b070 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1b080 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1b090 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1b0a0 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1b0b0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1b0c0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1b0d0 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1b0e0 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1b0f0 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1b100 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1b110 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1b120 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1b130 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1b140 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1b150 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1b160 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1b170 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1b180 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1b190 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1b1a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b1b0 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1b1c0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1b1d0 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1b1e0 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1b1f0 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1b200 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1b210 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1b220 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1b230 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1b240 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1b250 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1b260 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1b270 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
1b280 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
1b290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1b2b0 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1b2c0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1b2d0 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b2f0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1b300 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1b310 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1b320 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1b330 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1b340 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1b350 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1b360 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1b370 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1b380 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1b390 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1b3a0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1b3b0 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b  x<szHdr && d<=nK
1b3c0 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1b3d0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1b3e0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1b3f0 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1b400 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1b410 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1b420 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1b430 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1b440 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1b450 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1b460 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1b470 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1b480 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1b490 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1b4a0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  alloc = 0;.    p
1b4b0 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20  Mem->z = 0;.    
1b4c0 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1b4d0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1b4e0 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1b4f0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1b500 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1b510 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1b520 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
1b530 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1b540 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
1b550 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1b560 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
1b570 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
1b580 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1b590 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
1b5a0 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
1b5b0 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
1b5c0 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
1b5d0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1b5e0 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
1b5f0 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
1b600 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
1b610 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1b620 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
1b630 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
1b640 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
1b650 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b660 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
1b670 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
1b680 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
1b690 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
1b6a0 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
1b6b0 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
1b6c0 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
1b6d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1b6e0 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
1b6f0 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
1b700 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
1b710 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
1b720 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
1b730 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1b740 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
1b750 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
1b760 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
1b770 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
1b780 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
1b790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1b7a0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1b7b0 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
1b7c0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1b7d0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1b7e0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
1b7f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1b800 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
1b810 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1b820 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
1b830 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
1b840 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
1b850 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1b860 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1b870 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1b880 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1b890 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1b8a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b8b0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1b8c0 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
1b8d0 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
1b8e0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
1b8f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1b900 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1b910 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
1b920 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
1b930 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1b940 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1b950 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1b960 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1b970 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
1b980 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
1b990 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1b9a0 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
1b9b0 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
1b9c0 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
1b9d0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1b9e0 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
1b9f0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
1ba00 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
1ba10 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
1ba20 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
1ba30 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1ba40 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
1ba50 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1ba60 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1ba70 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1ba80 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
1ba90 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
1baa0 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
1bab0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
1bac0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
1bad0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
1bae0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
1baf0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
1bb00 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
1bb10 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
1bb20 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
1bb30 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
1bb40 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
1bb50 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1bb60 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1bb70 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1bb80 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1bb90 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1bba0 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1bbb0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1bbc0 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1bbd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1bbe0 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1bbf0 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1bc00 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1bc10 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1bc20 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1bc30 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1bc40 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1bc50 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1bc60 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1bc70 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1bc80 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1bc90 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1bca0 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1bcb0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1bcc0 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1bcd0 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1bce0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1bcf0 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1bd00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1bd10 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1bd20 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1bd30 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
1bd40 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1bd50 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1bd60 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1bd70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1bd80 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1bd90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1bda0 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1bdb0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1bdc0 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1bdd0 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1bde0 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1bdf0 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1be00 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1be10 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1be20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1be30 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1be40 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1be50 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1be60 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1be70 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1be80 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1be90 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1bea0 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1beb0 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1bec0 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1bed0 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1bee0 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1bef0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1bf00 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1bf10 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1bf20 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1bf30 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1bf40 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1bf50 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1bf60 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1bf70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1bf80 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1bf90 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1bfa0 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
1bfb0 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
1bfc0 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
1bfd0 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
1bfe0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1bff0 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
1c000 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
1c010 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c020 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
1c030 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
1c040 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
1c050 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
1c060 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1c070 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1c080 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
1c090 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
1c0a0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
1c0b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1c0c0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
1c0d0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
1c0e0 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
1c0f0 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
1c100 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1c110 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1c120 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1c130 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1c140 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1c150 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1c160 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1c170 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1c180 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1c190 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1c1a0 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1c1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1c1c0 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1c1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1c1e0 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1c1f0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1c200 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1c210 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1c220 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1c230 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1c240 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1c250 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1c260 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1c270 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1c280 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1c290 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1c2a0 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1c2b0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1c2c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1c2d0 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1c2e0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1c2f0 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1c300 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1c310 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1c320 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1c330 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1c340 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1c350 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1c360 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1c370 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1c380 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1c390 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1c3a0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1c3b0 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1c3c0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1c3d0 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1c3e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1c3f0 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1c400 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1c410 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1c420 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1c430 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1c440 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1c450 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1c460 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1c470 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c480 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1c490 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1c4a0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1c4b0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1c4c0 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1c4d0 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1c4e0 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1c4f0 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1c500 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1c510 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1c520 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1c530 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1c540 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1c550 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  by pKeyInfo->nFi
1c560 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld + pKeyInfo->
1c570 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  nXField..**.** I
1c580 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  f this constrain
1c590 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  t is not satisfi
1c5a0 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ed, it means tha
1c5b0 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64  t the high-speed
1c5c0 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f  .** vdbeRecordCo
1c5d0 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1c5e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c5f0 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  String() routine
1c600 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
1c610 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  rk correctly.  I
1c620 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  f this assert() 
1c630 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70  ever fires, it p
1c640 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a  robably means.**
1c650 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66   that the KeyInf
1c660 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  o.nField or KeyI
1c670 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75  nfo.nXField valu
1c680 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1c690 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1c6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c6b0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1c6c0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1c6d0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1c6e0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1c6f0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1c700 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1c710 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1c720 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1c730 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1c740 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1c750 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1c760 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1c770 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1c780 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1c790 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1c7a0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1c7b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c7c0 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1c7d0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1c7e0 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1c7f0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1c800 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1c810 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1c820 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1c830 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1c840 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1c850 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1c860 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1c870 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1c880 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1c890 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1c8a0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1c8b0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1c8c0 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1c8d0 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1c8e0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1c8f0 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1c900 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1c910 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1c920 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1c930 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1c940 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1c950 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1c960 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1c970 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1c980 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1c990 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1c9a0 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1c9b0 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1c9c0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1c9d0 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1c9e0 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1c9f0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1ca00 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1ca10 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1ca20 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1ca30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1ca40 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1ca50 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1ca60 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1ca70 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1ca80 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1ca90 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1cac0 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1cad0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1cae0 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1caf0 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1cb00 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1cb10 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1cb20 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1cb30 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1cb40 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1cb50 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1cb60 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1cb70 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1cb80 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1cb90 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1cba0 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1cbb0 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1cbc0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1cbd0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1cbe0 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31   *v2;.    int n1
1cbf0 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31  , n2;.    Mem c1
1cc00 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1cc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1cc20 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1cc30 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1cc40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1cc50 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1cc60 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1cc70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cc80 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1cc90 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1cca0 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1ccb0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1ccc0 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1ccd0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1cce0 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1ccf0 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1cd00 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1cd10 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31  ll->enc);.    n1
1cd20 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63   = v1==0 ? 0 : c
1cd30 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  1.n;.    v2 = sq
1cd40 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1cd50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1cd60 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
1cd70 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20  .    n2 = v2==0 
1cd80 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20  ? 0 : c2.n;.    
1cd90 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1cda0 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
1cdb0 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a  1, v1, n2, v2);.
1cdc0 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1cdd0 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45  | v2==0) && prcE
1cde0 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1cdf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1ce00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ce10 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29  eMemRelease(&c1)
1ce20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ce30 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29  eMemRelease(&c2)
1ce40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1ce50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1ce60 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20 69 73  e input pBlob is
1ce70 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1ce80 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20 69 73  e a Blob that is
1ce90 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77   not marked.** w
1cea0 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52  ith MEM_Zero.  R
1ceb0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
1cec0 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65 72 6f   could be a zero
1ced0 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63  -blob..*/.static
1cee0 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63   int isAllZero(c
1cef0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
1cf00 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t n){.  int i;. 
1cf10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
1cf20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
1cf30 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ] ) return 0;.  
1cf40 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
1cf50 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1cf60 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72  wo blobs.  Retur
1cf70 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1cf80 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1cf90 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73   the first.** is
1cfa0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1cfb0 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1cfc0 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1cfd0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
1cfe0 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69  ** If one blob i
1cff0 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
1d000 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68  e other, then th
1d010 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65  e shorter is the
1d020 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   lessor..*/.stat
1d030 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
1d040 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c  NE int sqlite3Bl
1d050 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
1d060 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20  Mem *pB1, const 
1d070 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74  Mem *pB2){.  int
1d080 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 70   c;.  int n1 = p
1d090 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32 20  B1->n;.  int n2 
1d0a0 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20  = pB2->n;..  /* 
1d0b0 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
1d0c0 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76 61  o have a Blob va
1d0d0 6c 75 65 20 74 68 61 74 20 68 61 73 20 73 6f 6d  lue that has som
1d0e0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65  e non-zero conte
1d0f0 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  nt.  ** followed
1d100 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e 74   by zero content
1d110 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c 79  .  But that only
1d120 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42 6c   comes up for Bl
1d130 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a 20  obs formed.  ** 
1d140 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1d150 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e 64  cord opcode, and
1d160 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76 65   such Blobs neve
1d170 72 20 67 65 74 20 70 61 73 73 65 64 20 69 6e 74  r get passed int
1d180 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65  o.  ** sqlite3Me
1d190 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a 20  mCompare(). */. 
1d1a0 20 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e 66   assert( (pB1->f
1d1b0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1d1c0 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a  ==0 || n1==0 );.
1d1d0 20 20 61 73 73 65 72 74 28 20 28 70 42 32 2d 3e    assert( (pB2->
1d1e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1d1f0 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b  )==0 || n2==0 );
1d200 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66 6c  ..  if( (pB1->fl
1d210 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29 20  ags|pB2->flags) 
1d220 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1d230 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73    if( pB1->flags
1d240 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26 20   & pB2->flags & 
1d250 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
1d260 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e    return pB1->u.
1d270 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e  nZero - pB2->u.n
1d280 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Zero;.    }else 
1d290 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26  if( pB1->flags &
1d2a0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1d2b0 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72     if( !isAllZer
1d2c0 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e  o(pB2->z, pB2->n
1d2d0 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
1d2e0 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d       return pB1-
1d2f0 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20  >u.nZero - n2;. 
1d300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d310 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70  if( !isAllZero(p
1d320 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20 29  B1->z, pB1->n) )
1d330 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d340 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70 42    return n1 - pB
1d350 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  2->u.nZero;.    
1d360 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d 63  }.  }.  c = memc
1d370 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e  mp(pB1->z, pB2->
1d380 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a 20  z, n1>n2 ? n2 : 
1d390 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72  n1);.  if( c ) r
1d3a0 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72  eturn c;.  retur
1d3b0 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a  n n1 - n2;.}../*
1d3c0 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69  .** Do a compari
1d3d0 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34  son between a 64
1d3e0 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1d3f0 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74  ger and a 64-bit
1d400 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a   floating-point.
1d410 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ** number.  Retu
1d420 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1d430 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1d440 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34  f the first (i64
1d450 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a  ) is less than,.
1d460 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  ** equal to, or 
1d470 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1d480 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29   second (double)
1d490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d4a0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1d4b0 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f  ompare(i64 i, do
1d4c0 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73  uble r){.  if( s
1d4d0 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45  izeof(LONGDOUBLE
1d4e0 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20  _TYPE)>8 ){.    
1d4f0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20  LONGDOUBLE_TYPE 
1d500 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  x = (LONGDOUBLE_
1d510 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20  TYPE)i;.    if( 
1d520 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  x<r ) return -1;
1d530 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72  .    if( x>r ) r
1d540 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65  eturn +1;.    re
1d550 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
1d560 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20  .    i64 y;.    
1d570 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66  double s;.    if
1d580 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38  ( r<-92233720368
1d590 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74  54775808.0 ) ret
1d5a0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20  urn +1;.    if( 
1d5b0 72 3e 39 32 32 33 33 37 32 30 33 36 38 35 34 37  r>92233720368547
1d5c0 37 35 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e  75807.0 ) return
1d5d0 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36   -1;.    y = (i6
1d5e0 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79  4)r;.    if( i<y
1d5f0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1d600 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20    if( i>y ){.   
1d610 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45     if( y==SMALLE
1d620 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e  ST_INT64 && r>0.
1d630 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1d640 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a       return +1;.
1d650 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64      }.    s = (d
1d660 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28  ouble)i;.    if(
1d670 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   s<r ) return -1
1d680 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29 20  ;.    if( s>r ) 
1d690 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1d6a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
1d6b0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
1d6c0 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
1d6d0 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
1d6e0 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
1d6f0 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
1d700 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
1d710 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
1d720 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1d730 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
1d740 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
1d750 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
1d760 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
1d770 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
1d780 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
1d790 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
1d7a0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
1d7b0 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
1d7c0 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
1d7d0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
1d7e0 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
1d7f0 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
1d800 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
1d810 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1d820 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1d830 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
1d840 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1d850 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
1d860 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1d870 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
1d880 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
1d890 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1d8a0 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b  ){.  int f1, f2;
1d8b0 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f  .  int combined_
1d8c0 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70  flags;..  f1 = p
1d8d0 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  Mem1->flags;.  f
1d8e0 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  2 = pMem2->flags
1d8f0 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  ;.  combined_fla
1d900 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73  gs = f1|f2;.  as
1d910 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f  sert( (combined_
1d920 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
1d930 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a  et)==0 );. .  /*
1d940 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1d950 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73   NULL, it is les
1d960 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  s than the other
1d970 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
1d980 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20  .  ** are NULL, 
1d990 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
1d9a0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1d9b0 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
1d9c0 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d      return (f2&M
1d9d0 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d  EM_Null) - (f1&M
1d9e0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20  EM_Null);.  }.. 
1d9f0 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65   /* At least one
1da00 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75   of the two valu
1da10 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20  es is a number. 
1da20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1da30 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  ed_flags&(MEM_In
1da40 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20  t|MEM_Real) ){. 
1da50 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1da60 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
1da70 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1da80 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.i < pMem2->u
1da90 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .i ) return -1;.
1daa0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1dab0 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i > pMem2->u.
1dac0 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  i ) return +1;. 
1dad0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1dae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1daf0 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c   & f2 & MEM_Real
1db00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1db10 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70  ( pMem1->u.r < p
1db20 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1db30 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1db40 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d   pMem1->u.r > pM
1db50 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
1db60 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1db70 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1db80 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29  if( (f1&MEM_Int)
1db90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1dba0 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f2&MEM_Real)!=
1dbb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1dbc0 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  urn sqlite3IntFl
1dbd0 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31  oatCompare(pMem1
1dbe0 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e  ->u.i, pMem2->u.
1dbf0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1dc00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dc10 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1dc20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
1dc30 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1dc40 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1dc50 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1dc60 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74     return -sqlit
1dc70 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1dc80 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d  e(pMem2->u.i, pM
1dc90 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em1->u.r);.     
1dca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dcb0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1dcc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
1dcd0 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f  urn +1;.  }..  /
1dce0 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1dcf0 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
1dd00 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
1dd10 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
1dd20 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
1dd30 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
1dd40 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
1dd50 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
1dd60 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
1dd70 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1dd80 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
1dd90 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
1dda0 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1ddb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1ddc0 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
1ddd0 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1dde0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1ddf0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1de00 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1de10 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d  em2->enc || pMem
1de20 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1->db->mallocFai
1de30 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  led );.    asser
1de40 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  t( pMem1->enc==S
1de50 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20  QLITE_UTF8 || . 
1de60 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31             pMem1
1de70 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1de80 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e  F16LE || pMem1->
1de90 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
1dea0 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  6BE );..    /* T
1deb0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1dec0 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65  uence must be de
1ded0 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f  fined at this po
1dee0 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  int, even if.   
1def0 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c   ** the user del
1df00 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  etes the collati
1df10 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65  on sequence afte
1df20 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  r the vdbe progr
1df30 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d  am is.    ** com
1df40 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20  piled (this was 
1df50 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63  not always the c
1df60 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ase)..    */.   
1df70 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20   assert( !pColl 
1df80 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  || pColl->xCmp )
1df90 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ;..    if( pColl
1dfa0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1dfb0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1dfc0 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65  tring(pMem1, pMe
1dfd0 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20  m2, pColl, 0);. 
1dfe0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61     }.    /* If a
1dff0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61   NULL pointer wa
1e000 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
1e010 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e  collate function
1e020 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20  , fall through. 
1e030 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f     ** to the blo
1e040 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d  b case and use m
1e050 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d  emcmp().  */.  }
1e060 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c  . .  /* Both val
1e070 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62  ues must be blob
1e080 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e  s.  Compare usin
1e090 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  g memcmp().  */.
1e0a0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1e0b0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d  BlobCompare(pMem
1e0c0 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f  1, pMem2);.}.../
1e0d0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
1e0e0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1e0f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1e100 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65  is a serial-type
1e110 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70   that.** corresp
1e120 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  onds to an integ
1e130 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20  er - all values 
1e140 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20  between 1 and 9 
1e150 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78  inclusive .** ex
1e160 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f  cept 7. The seco
1e170 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  nd points to a b
1e180 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1e190 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
1e1a0 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20  e.** serialized 
1e1b0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72  according to ser
1e1c0 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66  ial_type. This f
1e1d0 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1e1e0 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75  izes.** and retu
1e1f0 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a  rns the value..*
1e200 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62  /.static i64 vdb
1e210 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1e220 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
1e230 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  , const u8 *aKey
1e240 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73  ){.  u32 y;.  as
1e250 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1e260 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1e270 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79  >=1 && serial_ty
1e280 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f  pe<=9 && serial_
1e290 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77  type!=7) );.  sw
1e2a0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1e2b0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  e ){.    case 0:
1e2c0 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
1e2d0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e2e0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e2f0 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59     return ONE_BY
1e300 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1e310 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20    case 2:.      
1e320 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e330 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e340 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f  return TWO_BYTE_
1e350 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1e360 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73  ase 3:.      tes
1e370 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1e380 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1e390 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49  urn THREE_BYTE_I
1e3a0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1e3b0 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 4: {.      te
1e3c0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1e3d0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20  0x80 );.      y 
1e3e0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1e3f0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65  (aKey);.      re
1e400 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a  turn (i64)*(int*
1e410 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  )&y;.    }.    c
1e420 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74  ase 5: {.      t
1e430 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1e440 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1e450 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f  eturn FOUR_BYTE_
1e460 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1e470 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1e480 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1e490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e4a0 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20   6: {.      u64 
1e4b0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1e4c0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1e4d0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e4e0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e4f0 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1e500 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1e510 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75  y+4);.      retu
1e520 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26  rn (i64)*(i64*)&
1e530 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
1e540 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
1e550 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a  ype - 8);.}../*.
1e560 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e570 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
1e580 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
1e590 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
1e5a0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
1e5b0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
1e5c0 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
1e5d0 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
1e5e0 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1e5f0 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
1e600 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
1e610 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
1e620 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
1e630 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
1e640 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
1e650 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
1e660 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f  created by the O
1e670 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1e680 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
1e690 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
1e6a0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
1e6b0 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
1e6c0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1e6d0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
1e6e0 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
1e6f0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69  If argument bSki
1e700 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  p is non-zero, i
1e710 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1e720 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1e730 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65   already.** dete
1e740 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1e750 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1e760 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1e770 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  al..**.** Key1 a
1e780 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
1e790 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
1e7a0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
1e7b0 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c  f fields. If all
1e7c0 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74   .** fields that
1e7d0 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20   appear in both 
1e7e0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20  keys are equal, 
1e7f0 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  then pPKey2->def
1e800 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72  ault_rc is .** r
1e810 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1e820 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1e830 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65  ption is discove
1e840 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d  red, set pPKey2-
1e850 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20  >errCode to .** 
1e860 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
1e870 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20  nd return 0. If 
1e880 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
1e890 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a  encountered, .**
1e8a0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1e8b0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
1e8c0 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20  E_NOMEM and, if 
1e8d0 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
1e8e0 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61  the.** malloc-fa
1e8f0 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e  iled flag set on
1e900 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1e910 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e   (pPKey2->pKeyIn
1e920 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20  fo->db)..*/.int 
1e930 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e940 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1e950 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1e960 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1e970 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1e980 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1e990 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20  ord *pPKey2,    
1e9a0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1e9b0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1e9e0 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73  e, skip the firs
1e9f0 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  t field */.){.  
1ea00 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1ea30 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1ea40 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1ea50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
1ea80 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72   field to compar
1ea90 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  e */.  u32 szHdr
1eaa0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1eab0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1eac0 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  f record header 
1ead0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1eae0 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb00 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
1eb10 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20   type in header 
1eb20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  */.  int rc = 0;
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1eb50 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  alue */.  Mem *p
1eb60 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  Rhs = pPKey2->aM
1eb70 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  em;       /* Nex
1eb80 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1eb90 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  2 to compare */.
1eba0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1ebb0 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1ebc0 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
1ebd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1ebe0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1ebf0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1ec00 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
1ec10 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
1ec20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1ec30 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1ec40 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
1ec50 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
1ec60 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1ec70 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
1ec80 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
1ec90 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
1eca0 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
1ecb0 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
1ecc0 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
1ecd0 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
1ece0 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
1ecf0 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
1ed00 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
1ed10 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
1ed20 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
1ed30 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
1ed40 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
1ed50 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
1ed60 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1ed70 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
1ed80 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
1ed90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
1eda0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1edb0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1edc0 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
1edd0 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69      if( d1>(unsi
1ede0 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20  gned)nKey1 ){ . 
1edf0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1ee00 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1ee10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ee20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1ee30 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1ee40 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  /.    }.    i = 
1ee50 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e  0;.  }..  VVA_ON
1ee60 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1ee70 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1ee80 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1ee90 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1eea0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  /.  assert( pPKe
1eeb0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1eec0 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65  ield+pPKey2->pKe
1eed0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1eee0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a  pPKey2->nField .
1eef0 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1ef00 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1ef10 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1ef20 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1ef30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1ef40 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1ef50 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1ef60 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1ef70 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1ef80 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1ef90 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1efa0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1efb0 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  n integer */.   
1efc0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1efd0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
1efe0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1eff0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1f000 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1f010 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1f020 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1f030 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1f040 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1f050 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f060 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1f070 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f080 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f090 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1f0a0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  7 ){.        sql
1f0b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1f0c0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1f0d0 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1f0e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1f0f0 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74  -sqlite3IntFloat
1f100 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e  Compare(pRhs->u.
1f110 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20  i, mem1.u.r);.  
1f120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f130 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62     i64 lhs = vdb
1f140 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1f150 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61  (serial_type, &a
1f160 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20  Key1[d1]);.     
1f170 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68     i64 rhs = pRh
1f180 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1f190 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1f1a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1f1b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1f1c0 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1f1d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1f1e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f1f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f200 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f  * RHS is real */
1f210 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1f220 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1f230 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65  Real ){.      se
1f240 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1f250 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69  1[idx1];.      i
1f260 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1f270 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  10 ){.        /*
1f280 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32   Serial types 12
1f290 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20   or greater are 
1f2a0 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62  strings and blob
1f2b0 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a  s (greater than.
1f2c0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1f2d0 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e  rs). Types 10 an
1f2e0 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74  d 11 are current
1f2f0 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72  ly "reserved for
1f300 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20   future .       
1f310 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20   ** use", so it 
1f320 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d  doesn't really m
1f330 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72  atter what the r
1f340 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
1f350 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
1f360 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20  hem to numberic 
1f370 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a  values are.  */.
1f380 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1f390 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1f3a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1f3b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f3c0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1f3d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f3e0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1f3f0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1f400 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
1f410 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61         if( seria
1f420 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1f430 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e         if( mem1.
1f440 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r<pRhs->u.r ){
1f450 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f460 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
1f470 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75  }else if( mem1.u
1f480 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a  .r>pRhs->u.r ){.
1f490 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1f4a0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   +1;.          }
1f4b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f4c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f4d0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1f4e0 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20  mpare(mem1.u.i, 
1f4f0 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  pRhs->u.r);.    
1f500 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f510 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1f520 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20  is a string */. 
1f530 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1f540 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
1f550 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  r ){.      getVa
1f560 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1f570 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1f580 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f590 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1f5a0 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1f5b0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1f5c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f5d0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f5e0 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1f5f0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1f600 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f620 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69    mem1.n = (seri
1f630 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1f640 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1f650 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29  ase( (d1+mem1.n)
1f660 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1f670 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1f680 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1f690 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  n+1)==(unsigned)
1f6a0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1f6b0 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29   if( (d1+mem1.n)
1f6c0 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1f6d0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1f6e0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1f6f0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1f700 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f710 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f730 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1f740 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1f750 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1f760 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [i] ){.         
1f770 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
1f780 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  Info->enc;.     
1f790 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70       mem1.db = p
1f7a0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
1f7b0 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67         mem1.flag
1f7c0 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20  s = MEM_Str;.   
1f7d0 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20         mem1.z = 
1f7e0 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31  (char*)&aKey1[d1
1f7f0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ];.          rc 
1f800 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  = vdbeCompareMem
1f810 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20  String(.        
1f820 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68        &mem1, pRh
1f830 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  s, pKeyInfo->aCo
1f840 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e  ll[i], &pPKey2->
1f850 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20  errCode.        
1f860 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
1f870 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1f880 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d  t nCmp = MIN(mem
1f890 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  1.n, pRhs->n);. 
1f8a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1f8b0 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1f8c0 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1f8d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f8e0 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31  c==0 ) rc = mem1
1f8f0 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20  .n - pRhs->n; . 
1f900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f910 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1f920 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  HS is a blob */.
1f930 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1f940 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  s->flags & MEM_B
1f950 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lob ){.      ass
1f960 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61 67  ert( (pRhs->flag
1f970 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1f980 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29   || pRhs->n==0 )
1f990 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  ;.      getVarin
1f9a0 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1f9b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1f9c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f9d0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1f9e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1f9f0 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1fa00 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1fa10 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1fa20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1fa30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1fa40 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1fa50 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1fa60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fa70 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1fa80 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1fa90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1faa0 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1fab0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1fac0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1fad0 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1fae0 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1faf0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1fb00 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1fb10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fb20 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1fb30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1fb40 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1fb50 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1fb60 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1fb70 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1fb80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1fb90 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73  !isAllZero((cons
1fba0 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64  t char*)&aKey1[d
1fbb0 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20 20  1],nStr) ){.    
1fbc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
1fbd0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1fbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fbf0 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 75  = nStr - pRhs->u
1fc00 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20  .nZero;.        
1fc10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1fc20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1fc30 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72   nCmp = MIN(nStr
1fc40 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1fc50 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1fc60 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1fc70 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1fc80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1fc90 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20  0 ) rc = nStr - 
1fca0 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pRhs->n;.       
1fcb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fcc0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1fcd0 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  null */.    else
1fce0 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1fcf0 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1fd00 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  ];.      rc = (s
1fd10 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a  erial_type!=0);.
1fd20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1fd30 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c!=0 ){.      if
1fd40 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1fd50 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1fd60 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
1fd70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1fd80 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
1fd90 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1fda0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1fdb0 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61  , rc) );.      a
1fdc0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1fdd0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1fde0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1fdf0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1fe00 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1fe10 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  i++;.    pRhs++;
1fe20 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1fe30 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1fe40 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1fe50 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71  ;.    idx1 += sq
1fe60 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
1fe70 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
1fe80 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73  while( idx1<(uns
1fe90 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20  igned)szHdr1 && 
1fea0 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1feb0 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65   && d1<=(unsigne
1fec0 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a  d)nKey1 );..  /*
1fed0 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1fee0 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1fef0 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1ff00 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1ff10 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1ff20 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1ff30 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1ff40 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1ff50 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1ff60 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1ff70 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1ff80 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1ff90 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  1).  */.  assert
1ffa0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1ffb0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1ffc0 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1ffd0 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  t one or both of
1ffe0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1fff0 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
20000 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
20010 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
20020 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
20030 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
20040 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
20050 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
20060 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
20070 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72      || vdbeRecor
20080 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
20090 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
200a0 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  y2, pPKey2->defa
200b0 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20  ult_rc) .       
200c0 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  || pKeyInfo->db-
200d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
200e0 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  );.  pPKey2->eqS
200f0 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  een = 1;.  retur
20100 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
20110 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
20120 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20130 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
20140 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
20150 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
20160 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
20170 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
20180 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
20190 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
201a0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
201b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
201c0 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
201d0 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a  y1, pPKey2, 0);.
201e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
201f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
20200 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
20210 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
20220 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
20230 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
20240 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
20250 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67  Key2 is an integ
20260 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20  er, and (b) the 
20270 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  .** size-of-head
20280 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65  er varint at the
20290 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
202a0 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
202b0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65  a single.** byte
202c0 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74   (i.e. is less t
202d0 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20  han 128)..**.** 
202e0 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e  To avoid concern
202f0 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f  s about buffer o
20300 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72  verreads, this r
20310 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
20320 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61  sed.** on schema
20330 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69  s where the maxi
20340 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72  mum valid header
20350 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65   size is 63 byte
20360 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74  s or less..*/.st
20370 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
20380 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
20390 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
203a0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
203b0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
203c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
203d0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
203e0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
203f0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
20400 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a  y = &((const u8*
20410 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20  )pKey1)[*(const 
20420 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46  u8*)pKey1 & 0x3F
20430 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  ];.  int serial_
20440 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75  type = ((const u
20450 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20  8*)pKey1)[1];.  
20460 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79  int res;.  u32 y
20470 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34  ;.  u64 x;.  i64
20480 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a   v;.  i64 lhs;..
20490 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
204a0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
204b0 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
204c0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
204d0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
204e0 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
204f0 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
20500 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
20510 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
20520 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
20530 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
20540 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
20550 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
20560 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
20570 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20590 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
205a0 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
205b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
205c0 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
205d0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
205e0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
205f0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20610 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
20620 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20630 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
20640 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
20650 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20660 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20680 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
20690 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
206a0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
206b0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
206c0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
206d0 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
206e0 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
206f0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20710 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
20720 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
20730 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20740 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
20750 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
20760 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
20770 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
20780 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20790 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
207a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
207b0 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
207c0 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
207d0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
207e0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
207f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20800 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
20810 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
20820 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
20830 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
20840 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
20850 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
20860 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20870 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
20880 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
20890 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
208a0 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
208b0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
208c0 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
208d0 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
208e0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
208f0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
20900 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
20910 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
20920 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
20930 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
20940 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
20950 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
20960 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
20970 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
20980 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
20990 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
209a0 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
209b0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
209c0 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
209d0 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
209e0 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
209f0 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
20a00 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
20a10 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
20a20 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
20a30 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
20a40 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
20a50 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
20a60 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
20a70 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
20a80 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
20a90 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20aa0 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
20ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20ac0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20ad0 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
20ae0 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
20af0 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d  }..  v = pPKey2-
20b00 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
20b10 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
20b20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20b30 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
20b40 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
20b50 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
20b60 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
20b70 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
20b80 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
20b90 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
20ba0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
20bb0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
20bc0 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
20bd0 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
20be0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
20bf0 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
20c00 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
20c10 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
20c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
20c30 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
20c40 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
20c50 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68  are equal and th
20c60 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c  ere are no trail
20c70 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ing.    ** field
20c80 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32  s. Return pPKey2
20c90 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20  ->default_rc in 
20ca0 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20  this case. */.  
20cb0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20cc0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
20cd0 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
20ce0 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   1;.  }..  asser
20cf0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
20d00 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
20d10 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20d20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  res) );.  return
20d30 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   res;.}../*.** T
20d40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20d50 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
20d60 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
20d70 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20d80 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
20d90 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
20da0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73  of pPKey2 is a s
20db0 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20  tring, that (b) 
20dc0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
20dd0 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ** uses the coll
20de0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
20df0 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68  INARY and (c) th
20e00 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
20e10 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a  eader varint .**
20e20 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20e30 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
20e40 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
20e50 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
20e60 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
20e70 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69  mpareString(.  i
20e80 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
20e90 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
20ea0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
20eb0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
20ec0 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
20ed0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
20ee0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
20ef0 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
20f00 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
20f10 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
20f20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  s;..  assert( pP
20f30 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c  Key2->aMem[0].fl
20f40 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
20f50 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
20f60 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
20f70 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
20f80 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
20f90 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  fo);.  getVarint
20fa0 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
20fb0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
20fc0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
20fd0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
20fe0 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
20ff0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
21000 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
21010 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
21020 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
21030 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
21040 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21050 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
21060 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
21070 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
21080 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
21090 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
210a0 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
210b0 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
210c0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
210d0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
210e0 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
210f0 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
21100 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
21110 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
21120 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
21130 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
21140 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
21150 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d      }.    nCmp =
21160 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d   MIN( pPKey2->aM
21170 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b  em[0].n, nStr );
21180 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d  .    res = memcm
21190 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c  p(&aKey1[szHdr],
211a0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
211b0 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
211c0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
211d0 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
211e0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
211f0 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
21200 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
21210 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
21220 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
21230 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
21240 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21250 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
21260 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
21270 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21280 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
21290 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
212a0 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t_rc;.          
212b0 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
212c0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
212d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
212e0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s>0 ){.        r
212f0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
21300 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21310 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
21320 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a  y2->r1;.      }.
21330 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
21340 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
21350 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
21360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21370 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
21380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
21390 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
213a0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
213b0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
213c0 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20  y2, res).       
213d0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20  || CORRUPT_DB.  
213e0 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
213f0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
21400 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
21410 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
21420 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21430 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
21440 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21450 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69  ompare() compati
21460 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ble function.** 
21470 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  suitable for com
21480 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  paring serialize
21490 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  d records to the
214a0 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
214b0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
214c0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
214d0 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72  .*/.RecordCompar
214e0 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  e sqlite3VdbeFin
214f0 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65  dCompare(Unpacke
21500 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f  dRecord *p){.  /
21510 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  * varintRecordCo
21520 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
21530 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
21540 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20  reString() both 
21550 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74  assume.  ** that
21560 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
21570 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20  der varint that 
21580 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
21590 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f  art of each reco
215a0 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20  rd.  ** fits in 
215b0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69  a single byte (i
215c0 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65  .e. is 127 or le
215d0 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72  ss). varintRecor
215e0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20  dCompareInt().  
215f0 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  ** also assumes 
21600 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
21610 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75  to overread a bu
21620 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74  ffer by at least
21630 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d   the .  ** maxim
21640 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61  um possible lega
21650 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c  l header size pl
21660 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61  us 8 bytes. Beca
21670 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a  use there is.  *
21680 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
21690 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28  be at least 74 (
216a0 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74  but not 136) byt
216b0 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f  es of padding fo
216c0 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a  llowing each.  *
216d0 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
216e0 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  to varintRecordC
216f0 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73  ompareInt() this
21700 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e   makes it conven
21710 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d  ient to.  ** lim
21720 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
21730 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20  he header to 64 
21740 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77  bytes in cases w
21750 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66  here the first f
21760 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20  ield.  ** is an 
21770 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20  integer..  **.  
21780 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77  ** The easiest w
21790 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ay to enforce th
217a0 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63  is limit is to c
217b0 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63  onsider only rec
217c0 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31  ords with.  ** 1
217d0 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73  3 fields or less
217e0 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66  . If the first f
217f0 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67  ield is an integ
21800 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  er, the maximum 
21810 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  legal.  ** heade
21820 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20  r size is (12*5 
21830 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20  + 1 + 1) bytes. 
21840 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b   */.  if( (p->pK
21850 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
21860 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58   p->pKeyInfo->nX
21870 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20  Field)<=13 ){.  
21880 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
21890 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
218a0 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
218b0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
218c0 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
218d0 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
218e0 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
218f0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
21900 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
21910 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
21920 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
21930 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
21940 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
21950 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
21960 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
21970 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
21980 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
21990 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
219a0 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
219b0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
219c0 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
219d0 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
219e0 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
219f0 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
21a00 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
21a10 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
21a20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
21a30 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
21a40 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
21a50 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
21a60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
21a70 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
21a80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
21a90 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
21aa0 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
21ab0 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
21ac0 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
21ad0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
21ae0 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
21af0 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
21b00 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
21b10 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
21b20 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
21b30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
21b40 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
21b50 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
21b60 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
21b70 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
21b80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
21b90 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
21ba0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
21bb0 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
21bc0 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
21bd0 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
21be0 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
21bf0 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
21c00 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
21c10 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
21c20 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
21c30 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
21c40 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
21c50 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
21c60 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
21c70 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
21c80 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
21c90 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
21ca0 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
21cb0 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
21cc0 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
21cd0 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
21ce0 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
21cf0 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
21d00 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
21d10 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
21d20 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
21d30 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
21d40 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
21d50 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
21d60 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
21d70 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
21d80 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
21d90 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
21da0 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
21db0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
21dc0 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
21dd0 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
21de0 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
21df0 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
21e00 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
21e10 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
21e20 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
21e30 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
21e40 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
21e50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
21e60 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
21e70 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
21e80 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
21e90 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
21ea0 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
21eb0 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
21ec0 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
21ed0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
21ee0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
21ef0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
21f00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21f10 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
21f20 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
21f30 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20  nCellKey, &m);. 
21f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
21f50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
21f60 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
21f70 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
21f80 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
21f90 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
21fa0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
21fb0 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
21fc0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
21fd0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
21fe0 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
21ff0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
22000 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
22010 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
22020 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
22030 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
22040 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
22050 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
22060 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
22070 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
22080 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
22090 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
220a0 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
220b0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
220c0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
220d0 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
220e0 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
220f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22100 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
22110 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22120 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
22130 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
22140 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22150 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
22160 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22170 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
22180 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22190 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
221a0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
221b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
221c0 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
221d0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
221e0 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
221f0 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
22200 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
22210 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
22220 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
22230 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
22240 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
22250 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20  s[typeRowid];.  
22260 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
22270 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
22280 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
22290 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
222a0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
222b0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
222c0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
222d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
222e0 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
222f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
22300 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
22310 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
22320 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
22330 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
22340 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
22350 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
22360 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22370 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
22380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22390 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
223a0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
223b0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
223c0 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
223d0 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
223e0 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
223f0 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
22400 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22410 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
22420 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
22430 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c  estcase( m.szMal
22440 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
22450 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
22460 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
22470 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22480 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
22490 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
224a0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
224b0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
224c0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
224d0 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
224e0 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
224f0 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
22500 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
22510 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
22520 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
22530 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
22540 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
22550 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
22560 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
22570 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
22580 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
22590 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
225a0 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
225b0 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
225c0 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
225d0 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
225e0 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
225f0 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
22600 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
22610 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
22620 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
22630 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
22640 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
22650 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
22660 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
22670 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
22680 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
22690 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
226a0 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
226b0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
226c0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
226d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
22700 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
22710 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22730 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
22740 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
22750 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22760 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
22770 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
22780 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
22790 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
227c0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
227d0 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
227e0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
227f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
22800 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
22810 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
22820 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
22830 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
22840 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e  );.  pCur = pC->
22850 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
22860 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
22870 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
22880 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
22890 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
228a0 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
228b0 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  ur);.  /* nCellK
228c0 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
228d0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
228e0 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
228f0 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
22900 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
22910 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
22920 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
22930 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
22940 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
22950 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
22960 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
22970 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
22980 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22990 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
229a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
229b0 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
229c0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
229d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
229e0 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
229f0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
22a00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
22a10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22a20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  }.  *res = sqlit
22a30 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
22a40 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  are(m.n, m.z, pU
22a50 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69  npacked);.  sqli
22a60 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
22a70 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
22a80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22a90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22aa0 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
22ab0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
22ac0 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
22ad0 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
22ae0 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
22af0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
22b00 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
22b10 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
22b20 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
22b30 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
22b40 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
22b50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
22b60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
22b70 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
22b80 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
22b90 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
22ba0 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
22bb0 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
22bc0 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
22bd0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
22be0 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
22bf0 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
22c00 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
22c10 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
22c20 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
22c30 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
22c40 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
22c50 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
22c60 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
22c70 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
22c80 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22c90 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
22ca0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
22cb0 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
22cc0 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
22cd0 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
22ce0 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
22cf0 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
22d00 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
22d10 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
22d20 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
22d30 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
22d40 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
22d50 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
22d60 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
22d70 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
22d80 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
22d90 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
22da0 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
22db0 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
22dc0 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
22dd0 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
22de0 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
22df0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
22e00 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
22e10 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
22e20 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
22e30 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
22e40 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
22e50 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
22e60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
22e70 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
22e80 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
22e90 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
22ea0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
22eb0 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
22ec0 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
22ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22ee0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
22ef0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74  sqlite3_value st
22f00 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
22f10 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75  ng the value bou
22f20 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
22f30 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78  iVar of VM v. Ex
22f40 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c  cept, if the val
22f50 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c  ue is an SQL NUL
22f60 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20  L, return .** 0 
22f70 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20  instead. Unless 
22f80 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c  it is NULL, appl
22f90 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28  y affinity aff (
22fa0 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
22fb0 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74  E_AFF_*.** const
22fc0 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c  ants) to the val
22fd0 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
22fe0 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ing it..**.** Th
22ff0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
23000 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
23010 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
23020 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ng sqlite3ValueF
23030 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ree()..*/.sqlite
23040 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33  3_value *sqlite3
23050 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
23060 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
23070 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20  Var, u8 aff){.  
23080 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
23090 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
230a0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d   Mem *pMem = &v-
230b0 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20  >aVar[iVar-1];. 
230c0 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d     if( 0==(pMem-
230d0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
230e0 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l) ){.      sqli
230f0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20  te3_value *pRet 
23100 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
23110 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  w(v->db);.      
23120 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
23130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
23140 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52  emCopy((Mem *)pR
23150 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  et, pMem);.     
23160 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
23170 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
23180 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  t, aff, SQLITE_U
23190 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
231a0 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
231b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
231c0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
231d0 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
231e0 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
231f0 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
23200 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
23210 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
23220 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
23230 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
23240 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
23250 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
23260 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
23270 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
23280 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
23290 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
232a0 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
232b0 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
232c0 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20  f( iVar>32 ){.  
232d0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30    v->expmask = 0
232e0 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
232f0 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
23300 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
23310 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
23320 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
23330 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
23340 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  BLE./*.** Transf
23350 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  er error message
23360 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71   text from an sq
23370 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d  lite3_vtab.zErrM
23380 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
23390 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
233a0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
233b0 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20  e3_malloc) into 
233c0 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28  a Vdbe.zErrMsg (
233d0 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
233e0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
233f0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
23400 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64  Malloc)..*/.void
23410 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
23420 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70  rtErrmsg(Vdbe *p
23430 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  , sqlite3_vtab *
23440 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56  pVtab){.  if( pV
23450 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
23460 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
23470 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c  = p->db;.    sql
23480 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23490 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
234a0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
234b0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
234c0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
234d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
234e0 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
234f0 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a  g);.    pVtab->z
23500 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
23510 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
23520 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
23530 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
23540 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
23550 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a  EUPDATE_HOOK../*
23560 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
23570 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
23580 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20  t NULL, release 
23590 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  any allocations 
235a0 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
235b0 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ith the memory c
235c0 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61  ells in the p->a
235d0 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73  Mem[] array. Als
235e0 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63  o free the Unpac
235f0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
23600 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75  ucture itself, u
23610 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
23620 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ee()..**.** This
23630 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
23640 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b  d to free Unpack
23650 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
23660 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  res allocated by
23670 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61  .** the vdbeUnpa
23680 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
23690 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62  ion found in vdb
236a0 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69  eapi.c..*/.stati
236b0 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55  c void vdbeFreeU
236c0 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20  npacked(sqlite3 
236d0 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63  *db, UnpackedRec
236e0 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
236f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
23700 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
23710 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
23720 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
23730 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20   &p->aMem[i];.  
23740 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
23750 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56  alloc ) sqlite3V
23760 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
23770 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  em);.    }.    s
23780 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23790 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   p);.  }.}.#endi
237a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
237b0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
237c0 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  K */..#ifdef SQL
237d0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
237e0 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
237f0 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
23800 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74  pdate hook. If t
23810 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
23820 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75   or DELETE pre-u
23830 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74  pdate call,.** t
23840 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65  hen cursor passe
23850 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23860 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
23870 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77  point to the row
23880 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20   about.** to be 
23890 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  update or delete
238a0 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  d. If the applic
238b0 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ation calls sqli
238c0 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
238d0 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75  d(),.** the requ
238e0 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ired value will 
238f0 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
23900 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20   row the cursor 
23910 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f  points to..*/.vo
23920 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
23930 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56  eUpdateHook(.  V
23940 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23960 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74  * Vdbe pre-updat
23970 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65  e hook is invoke
23980 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75  d by */.  VdbeCu
23990 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
239a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
239b0 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e  sor to grab old.
239c0 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f  * values from */
239d0 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53     /* SQLITE_INS
23a00 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
23a10 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  ELETE */.  const
23a20 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
23a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
23a40 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
23a50 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62   /* Modified tab
23a80 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  le */.  i64 iKey
23a90 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
23aa0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
23ab0 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  al key value */.
23ac0 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
23af0 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a  r new.* record *
23b00 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23b10 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36  db = v->db;.  i6
23b20 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70  4 iKey2;.  PreUp
23b30 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a  date preupdate;.
23b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
23b50 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl = pTab->zName
23b60 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
23b70 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65   u8 fakeSortOrde
23b80 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
23b90 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  ( db->pPreUpdate
23ba0 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
23bb0 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73  &preupdate, 0, s
23bc0 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29  izeof(PreUpdate)
23bd0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  );.  if( op==SQL
23be0 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  ITE_UPDATE ){.  
23bf0 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65    iKey2 = v->aMe
23c00 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d  m[iReg].u.i;.  }
23c10 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20  else{.    iKey2 
23c20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20  = iKey1;.  }..  
23c30 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46  assert( pCsr->nF
23c40 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
23c50 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73   .       || (pCs
23c60 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d  r->nField==pTab-
23c70 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53  >nCol+1 && op==S
23c80 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20  QLITE_DELETE && 
23c90 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a  iReg==-1).  );..
23ca0 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20    preupdate.v = 
23cb0 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  v;.  preupdate.p
23cc0 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72  Csr = pCsr;.  pr
23cd0 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b  eupdate.op = op;
23ce0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65  .  preupdate.iNe
23cf0 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70  wReg = iReg;.  p
23d00 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
23d10 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75  .db = db;.  preu
23d20 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e  pdate.keyinfo.en
23d30 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70  c = ENC(db);.  p
23d40 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
23d50 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e  .nField = pTab->
23d60 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74  nCol;.  preupdat
23d70 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f  e.keyinfo.aSortO
23d80 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b  rder = (u8*)&fak
23d90 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72  eSortOrder;.  pr
23da0 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20  eupdate.iKey1 = 
23db0 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61  iKey1;.  preupda
23dc0 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32  te.iKey2 = iKey2
23dd0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54  ;.  preupdate.pT
23de0 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62  ab = pTab;..  db
23df0 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26  ->pPreUpdate = &
23e00 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d  preupdate;.  db-
23e10 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
23e20 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61  ack(db->pPreUpda
23e30 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a  teArg, db, op, z
23e40 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c  Db, zTbl, iKey1,
23e50 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70   iKey2);.  db->p
23e60 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  PreUpdate = 0;. 
23e70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23e80 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65  b, preupdate.aRe
23e90 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65  cord);.  vdbeFre
23ea0 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72  eUnpacked(db, pr
23eb0 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
23ec0 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
23ed0 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
23ee0 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65  date.pNewUnpacke
23ef0 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64  d);.  if( preupd
23f00 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20  ate.aNew ){.    
23f10 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
23f20 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65  =0; i<pCsr->nFie
23f30 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
23f40 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
23f50 6c 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65  lease(&preupdate
23f60 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d  .aNew[i]);.    }
23f70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23f80 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
23f90 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .aNew);.  }.}.#e
23fa0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
23fb0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
23fc0 48 4f 4f 4b 20 2a 2f 0a                          HOOK */.